1.6 树和二叉树

news2024/11/15 4:51:43

1.树的基本概念

2.二叉树的概念和性质

2.1.二叉树性质

1)结点个数

2)第i层,最多结点个数

3)者深度为k,前k层最多结点个数

4)叶子结点个数

2.2.完全二叉树性质

1)结点个数

2)第i层最多节点个数

3)前i层最多结点个数

4)叶子结点个数

5)所有叶子节点出现在哪?

6)右子树最大层次与左子树最大层次数

7)结点个数n = exp(k) 

8)树的深度k和节点个数之间的关系 k = exp(n)  

9)对于编号为i的结点,父结点点,右孩子,左孩子编号?

10)度为1的结点个数是几个?

2.3.答案

3.二叉树的存储

重点记忆:二叉链表结点的定义

typedef struct BTNode {
	int data;
	struct BTNode* Lchild, *Rchild;
}BTNode;

4.二叉树的遍历

/*以下是逻辑代码,并不能具体执行*/

typedef struct BTNode {
	int data;
	struct BTNode* Lchild, *Rchild;
}BTNode, TreeNode;


/**
 * 先序遍历
 * 顺序:左结点,根,右结点
 */
void preorder_traversal(TreeNode *root) {
	if (root == nullptr)
		return;

	printf("%d,", root->data);//根
	preorder_traversal(root->Lchild);
	preorder_traversal(root->Rchild);
}
/**
 * 中根序遍历
 * 顺序:左,根,右
 */
void inorder_traversal(TreeNode* root) {
	if (root == nullptr)
		return;

	inorder_traversal(root->Lchild);
	printf("%d,", root->data);
	inorder_traversal(root->Rchild);
}

/**
 * 后根序遍历
 * 顺序:左,右,根
 */
void postorder_traversal(TreeNode* root) {
	if (root == nullptr)
		return;

	inorder_traversal(root->Lchild);
	inorder_traversal(root->Rchild);
	printf("%d,", root->data);
}

重点:

  1. 已知一棵二叉树如右图,给出对这棵二叉树进行前序、中序、后序、层级遍历的结果序列
  2. 已知一棵二叉树的先序序列为 ABDGCFK,中序序列为 DGBAFCK,则后序序列为?
  3. 假设一棵二叉树先序序列为 EBADCFHGIKJ 和中序序列为 ABCDEFGHIJK,画出该树。

5.线索二叉树

遍历本质上来讲是:把非线性结构线性化的操作。
设一棵二叉树有 n 个结点,则有 n-1 条边(指针连线) ,而 n 个结点共有 2n 个指针
域( Lchild Rchild ) ,显然有 n+1 个空闲指针域未用。则可以利用这些空闲的指针域
来存放结点的直接前驱和直接后继信息。
对结点的指针域做如下规定:
若结点有左孩子,则 Lchild 指向其左孩子,否则,指向其直接前驱;
若结点有右孩子,则 Rchild 指向其右孩子,否则,指向其直接后继;
为避免混淆 ,
对结点结构加以改进,增加两个标志域,如图所示。

线索化二叉树: 二叉树的线索化指的是依照某种遍历次序使二叉树成为线索二叉树
的过程。
线索化的过程就是在 遍历过程中修改空指针使其指向直接前驱或直接后继的过程

6.树和二叉树的转换

6.1.树转二叉树

转换之后,符合左孩右兄的规律。

二叉树的根结点没有右子树,只有左子树;
左子结点仍然是原来树中相应结点的左子结点,而所有沿右链往下的右子结点均是原
来树中该结点的兄弟结点。

6.2.二叉树转树

6.3.森林转二叉树

转换步骤:
①将 F={T1, T2,.,Tn} 中的每棵树转换成二叉树。
②每棵二叉树作为前一棵二叉树的根结点的右子树,依次类推,则第一棵树的根结点就是转换后生成的二叉树的根结点。

6.4.二叉树转森林

6.5.树的遍历

树转换成二叉树后,

树的先序遍历实质上与将树转换成二叉树后对二叉树的先序遍历相同。
树的后序遍历实质上与将树转换成二叉树后对二叉树的中序遍历相同
树先序 : 二叉树先序
树后序 : 二叉树中序
例子:假设一棵二叉树的中序序列为 DCBGEAHFIJK 和后序序列为 DCEGBFHKJIA。请画
出该树包含的森林。
重点:如何转换,能画出转换后的树或二叉树

7.哈夫曼树

7.1.定义

①结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径。
②路径长度:结点路径上的分支数目称为路径长度。
③权(值):各种开销、代价、频度等的抽象称呼。
④结点的带权路径长度:从该结点的到树的根结点之间的路径长度与结点的权(值)的乘积
⑤ 树的路径长度:从树根到每一个结点的路径长度之和。
⑥树的带权路径长度:树中所有叶子结点的带权路径长度之和
Huffman 树:具有 n 个叶子结点(每个结点的权值为 wi) 的二叉树不止一棵,但在所有的这些二叉树中,必定存在一棵 带权路径长度最小的树,称这棵树为 Huffman 树(或称最优树)

7.2.哈夫曼树构造过程(重点)

①从小到大排序

②将最小的两个节点合并,回到步骤①

循环完成两个步骤即可。

7.3.Huffman 编码方法

由于每个字符都是叶子结点,不可能出现在根结点到其它字符结点的路径上,所以 个字符的 Huffman 编码不可能是另一个字符的 Huffman 编码的前缀

以字符集 C 作为叶子结点,次数或频度集 W 作为结点的权值来构造 Huffman 树。规定 Huffman 树中左分支代表“0”,右分支代表“1” 。
从根结点到每个叶子结点所经历的路径分支上的“0”或“1”所组成的字符串,为该叶子结点所对应的编码,称之为 Huffman 编码。

若字符集 C={a, b, c, d, e, f} 所对应的权值集合为 W={8, 3, 4, 6, 5, 5} ,如图所示,则字符
a,b, c,d, e,f 所对应的 Huffman 编码分别是: 10 010 011 00 110 111

7.4.总结

  • 哈夫曼树只有 0 度结点和 2 度结点(注意:如果是度为m的哈夫曼树,那么只有n_{0}n_{m});
  • 哈夫曼树的 WPL 值最小, WPL=\sum w_{i}*l_{i},其中w_{i}是权重,l_{i}是路径长度
  • 哈夫曼树不唯一,因为哈夫曼树的左右子树可以交换,但是 WPL 值唯一
  • 哈夫曼树本质上不属于二叉树,但是考试中我们认为哈夫曼树是二叉树
  • 哈夫曼树的上层结点权值不小于下层结点的权值
  • 哈夫曼编码只讨论叶子的编码
常见题型:
1)设一组权值集合 W= 15 3 14 2 6 9 16 17 ),要求根据这些权值集合
构造一棵哈夫曼树,则这棵哈夫曼树的带权路径长度为
2)平均编码长度公式  \frac{WPL}{\sum w_{i}} = \frac{\sum w_{i}*l_{i}}{\sum w_{i}}, 其中wi是叶子结点权值,li是路径长度。
3) 若度为 m 的哈夫曼树中,其叶结点个数为 n ,则非叶结点的个数为?
该哈夫曼树只有两种结点, 只有n_{0}n_{m}
叶子结点公式: n_{0} = n_{2} + 2*n_{3} + 3*n_{4} + ...(m-1)*n_{m} + 1
因此, n_{0} = (m-1)*n_{m} +1 \Rightarrow n_{m} = \frac{n-1}{m-1}

8.并查集

并查集( Union-findSets )是一种非常精巧而实用的数据结构,他主要用于处理一些不
相交集合的合并问题。一些常见的用途有求连通子图、求最小生成树的 Kruskal 算法和求
最近公共祖先( LeastCommonAncestors LCA )等.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1964017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云计算实训18——基于域名配置虚拟主机、基于ip配置虚拟主机、基于端口配置虚拟主机、配置samba、部署nfs服务器

一、配置文件的结构 1.首先查看配置文件 [rootstatic-server ~]# vim /usr/local/nginx/conf/nginx.conf 使用grep指令查看配置文件,同时不看空行不看注释 [rootstatic-server ~]# grep -Ev "#|^$" /usr/local/nginx/conf/nginx.conf 2.备份文件 将原有…

ComfyUI插件:ComfyUI Impact 节点(四)

前言: 学习ComfyUI是一场持久战,而 ComfyUI Impact 是一个庞大的模块节点库,内置许多非常实用且强大的功能节点 ,例如检测器、细节强化器、预览桥、通配符、Hook、图片发送器、图片接收器等等。通过这些节点的组合运用&#xff0…

mediawiki 启用 Minerva 皮肤后报错 哎呀!您在$wgDefaultSkin定义的wiki默认皮肤minervaneue不可用。

嗨喽大家好啊我是 kx 这是个常见的问题,废话不多说直接上解决方法 Minerva 皮肤在他的官网有说明怎么办 连接放到下面: https://www.mediawiki.org/wiki/Skin:Minerva_Neue 懒得看的话我把官网的话复制下来了,直接看就行了: 安…

JAVA通过debezium实时采集mysql数据

前期准备 需要提前安装mysql并且开启binlog,需要准备kafka和zookeeper环境 示例采用debezium1.9.0版本 Maven配置 <version.debezium>1.9.0.Final</version.debezium> <dependency> <groupId>io.debezium</groupId> <artifactId>debe…

【大模型系列篇】本地问答系统-部署Ollama、Open WebUI

部署本地大模型&#xff0c;结合Ollama、Open WebUI以及本地RAG&#xff08;Retrieval-Augmented Generation&#xff09;可以为用户提供一个强大的本地知识库和交互式对话系统。以下是详细的部署步骤和功能介绍&#xff1a; 一、部署Ollama 访问Ollama官网&#xff1a;首先&…

【3】Blazor链接数据库

【3】Blazor链接数据 一、引入Nuget包二、添加链接字符串三、创建DbContext四、注入SqlServer数据库五、执行数据库迁移六、创建用户信息页面七、结果展示 一、引入Nuget包 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.SqlServer Microsoft.EntityFramework…

Kafka的搭建及使用

Kafka搭建及使用 Kafka搭建 1、上传解压修改环境变量 # 解压 tar -zxvf kafka_2.11-1.0.0.tgz -C /usr/local/soft mv kafka_2.11-1.0.0 kafka-1.0.0tar -xvf 是一个在Unix和类Unix操作系统&#xff08;如Linux和macOS&#xff09;中用于解压缩或解包.tar文件的命令。 tar -…

java调用WebService接口

案例&#xff1a; 接口&#xff1a; http://xxxxx:8080/GetSPService.asmx 调用方法&#xff1a;GetSPByStnCodeToJsonStr 参数1&#xff1a;begin 开始时间 格式 yyyymmdd hh:mi &#xff08;日和小时之间有空格&#xff09; 例如&#xff1a;20230718 06:00 参数2: end …

IO模型思维导图

背景 &#xff1a; 并发服务器模型可以在同一时刻响应多个用户请求 多路复用IO&#xff1a; 4.多路复用IO 1.select 2.poll 3.epoll 1.select 缺点: 1.select监听文件描述符最大个数为1024 &#xff08;数组&#xff…

【CN】Argo 持续集成和交付(二)

7.25.通知 概述 Argo CD 通知持续监控 Argo CD 应用程序&#xff0c;并提供一种灵活的方式来通知用户应用程序状态的重要变化。使用灵活的触发器和模板机制&#xff0c;可以配置何时发送通知以及通知内容。Argo CD 通知包含有用的触发器和模板目录。因此&#xff0c;可以直接…

什么是住宅IP代理?有何用途?

在大数据时代&#xff0c;互联网成为我们生活与工作中不可或缺的一部分。然而&#xff0c;随着网络环境的日益复杂&#xff0c;隐私保护、网络访问限制等问题也逐渐凸显&#xff1b;以及跨境业务蓬勃发展。在这样的背景下&#xff0c;住宅IP代理作为一种技术解决方案&#xff0…

android studio 无法识别androidTest模块Test模块

android studio 无法识别androidTest模块Test模块 问题案例解决方法 androidTest是UI测试&#xff0c;可以运行在设备或虚拟设备上&#xff0c;需要编译打包为APK在设备上运行 版本依赖 android studio 2023.2.1 gradle kts架构 问题案例 下面无法识别到androidTest&#xff…

供应链|OR论文解读:具有内生随机交货期的双源库存最优策略

编者按 本次解读的文章发表于 Operations Research&#xff0c;原文信息&#xff1a;Song, J. S., Xiao, L., Zhang, H., & Zipkin, P. (2017). Optimal policies for a dual-sourcing inventory problem with endogenous stochastic lead times. Operations Research, 65…

11. 统计(均值、方差、正态分布)和聚类(接近kmeans的聚类)分类(python和c++代码)

以下代码的每个函数功能都做了注释&#xff0c;分别用python和c代码做了具体的实现&#xff0c;不是最终效果&#xff0c;后续会继续优化。以下代码中&#xff0c;python代码在每个步骤处理完数据后都画了散点图显示了处理后的数据效果&#xff0c;c代码是从python代码翻译过来…

学习大数据DAY28 python基础语法

目录 思维导图 数据类型 变量 输入 输出 运算符 bool 类型 常量变量拼接 流程控制 选择结构 if 循环结构 while 及 for 循环 字符串(String) 字符串的索引截取 索引 1.len() #获取字符串长度 2.str.find()字符查找 ,找到返回索引&#xff0c;没找到返回-1 3.st…

[Linux安全运维] iptables包过滤

前言 防火墙是网络安全中非常重要的设备&#xff0c;是一种将内部网络和外部网络隔离开的技术。简单来说&#xff0c;防火墙技术就是访问控制技术&#xff0c;由规则和动作组成。 目录 前言1. Linux 包过滤防火墙1 .1 概述1 .2 四表五链结构1 . 2 .1 规则表1 . 2 .2 规则链1 .…

扩散模型系列ControlNet: Adding Conditional Control to Text-to-Image Diffusion Models

向文本到图像扩散模型添加条件控制 摘要解读&#xff1a; 我对摘要英文的理解&#xff1a; 我们提出了一个神经网络架构ControlNet&#xff0c;可以向大规模的预训练好的文本到图像的扩散模型中添加空间条件控制。ControlNet锁住了准备生产的大规模扩散模型&#xff0c;并且重…

SLAM特征提取新变革:神经符号学结合自适应优化,实现环境适应性大飞跃!

论文标题&#xff1a; A Neurosymbolic Approach to Adaptive Feature Extraction in SLAM 论文作者&#xff1a; Yasra Chandio, Momin A. Khan, Khotso Selialia, Luis Garcia, Joseph DeGol, Fatima M. Anwar 导读&#xff1a; 本研究提出了一种创新的神经符号学方法&a…

Mybatis进阶提升-(一)Mybatis入门

前言 Mybatis是Java 项目开发使用率非常高的一款持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08…

python+selenium+unittest自动化测试框架

前言 关于自动化测试的介绍&#xff0c;网上已有很多资料&#xff0c;这里不再赘述&#xff0c;UI自动化测试是自动化测试的一种&#xff0c;也是测试金字塔最上面的一层&#xff0c;selenium是应用于web的自动化测试工具&#xff0c;支持多平台、多浏览器、多语言来实现自动化…