完整教程:树与二叉树的奥秘全解析

news/2025/11/22 18:06:46/文章来源:https://www.cnblogs.com/gccbuaa/p/19258264

目录

定义

基本性质

性质一

性质二

性质三

二叉树

定义

基本形态

性质

性质一

性质二

性质三

真题

存储结构

顺序结构

链式结构

遍历

前序遍历

中序遍历

后序遍历

性质

真题

特殊二叉树

满二叉树

完全二叉树

性质

线索二叉树

存储结构

中序遍历线索化

真题

哈夫曼树

计算WPL

定义

构造哈夫曼树

哈夫曼编码

真题

树与二叉树的转换

树转换成二叉树

二叉树转换成树

森林与二叉树的转换

二叉树转换为森林

森林转换为二叉树

遍历

树的遍历

森林的遍历

树、森林与二叉树的遍历关系


定义

树是一个或多个结点的有限集合

存在一个称为根的特定结点其余的结点被分为 n 个互不相交的集合 T1, T2, …, Tn, 其中的每个集合都是一棵树。T1, T2, …, Tn称为根节点的子树。

结点:树中的一个独立单元。

结点的度:结点拥有的子树数称为结点的度。

树的度:树内各结点度的最大值。

叶子:度为 0 的结点或终端结点。

非终端结点:度不为 0 的结点。

双亲和孩子:结点的子树的根称为该结点的孩子,相应地,该结点称为孩子的双亲。

层次:结点的层次从根开始定义,根为第一层,根的孩子为第二层,以此类推。

基本性质

性质一

树中所有结点数等于所有结点的度数之和加 1。


例题:

解析:

答案:

B


性质二

对于度为 m 的树,第 i 层上最多有 m^ i-1个结点。

性质三

对于高度为 h,度为 m 的树,最多有 (m ^ h - 1) / (m - 1) 个结点。

二叉树

定义

二叉树(Binary Tree)是 n(n ⩾ 0 )个结点所构成的集合,它或为空树(n=0),或为非空树。

对于非空树T:

(1)有且仅有一个 称为根的结点

(2)除根结点以外的其余结点分为两个互不相交的子集 T1 和 T2 ,分别称为 T 的左子树和右子树,且 T1 和 T2 本身又都是二叉树。

(3)二叉树每个结点至多只有两棵子树。

(4)二叉树的子树有左右之分,其次序不能任意颠倒。


基本形态


性质

性质一

二叉树的第 i 层最多有2 ^ (i-1)(i ⩾ 1)个结点。

性质二

深度为 k 的二叉树最多有2 ^ k - 1(k ⩾ 1)个结点。

性质三

对于任何非空的二叉树T,如果叶子结点的个数为n0,而度为2的结点数为n2,则 n0=n2+1

真题

题1

解析

答案

C


题2

解析:

答案:

C


题3

解析:

答案:

A

存储结构

顺序结构

链式结构

typedef char ElemType;
typedef struct TreeNode
{ElemType data;TreeNode *lchild;TreeNode *rchild;
}TreeNode;
typedef TreeNode* BiTree;

遍历

前序遍历

先访问根结点,然后访问左分支上遇到的每一个结点,持续这一过程,直到遇到空结点为止。这时,返回到最近的有右孩子的祖先结点,并从该结点的右孩子开始继续遍历。

void preOrder(BiTree T)
{if (T == NULL){return;}printf("%c ", T->data);preOrder(T->lchild);preOrder(T->rchild);
}
输出内容:A B D H K E C F I G J

中序遍历

先访问根结点,向树的左下方移动,直到遇到空结点为止,然后访问空结点的父结点。接着继续遍历该结点的右子树,如果右子树没的子树可以遍历,那么继续遍历上一层最后一个未被访问的结点

void inOrder(BiTree T)
{if (T == NULL){return;}inOrder(T->lchild);printf("%c ", T->data);inOrder(T->rchild);
}
输出内容:H K D B E A I F C G J

后序遍历

从根结点开始先访问结点的左右儿子,再对该结点进行访问。这就意味着结点的儿子将在该结点之前输出。

void postOrder(BiTree T)
{if (T == NULL){return;}postOrder(T->lchild);postOrder(T->rchild);printf("%c ", T->data);
}

输出内容:K H D E B I F J G C A


下列树的遍历结果是?

前序:A B D H E I C F G J K

中序:H D B E I A F C J G K

后序:H D I E B F J K G C A


下列树的遍历结果是?

前序:A B D E G H C F I

中序:D B G E H A F I C

后序:D G H E B I F C A


性质

已知前序遍历和中序遍历,可以唯一确定一棵二叉树。

已知中序遍历和后序遍历,可以唯一确定一棵二叉树。

已知前序遍历和后序遍历,是不能确定一棵二叉树的。

例:前序序列是ABC,后序序列是CBA

真题

题1

解析:

D.         A.         B. 

答案:

C


题2

答案:

B


题3

解析:

答案:
B

特殊二叉树

满二叉树

深度为 k 且含有 2 ^ k - 1个结点的二叉树

所有的叶子结点只能出现在最后一层

对于同样深度的二叉树,满二叉树的结点个数最多,叶子结点的数量也是最多的。

如果对满二叉树进行编号,根结点从1开始,从上到,下从左到右,对于编号为i的结点,若存在左孩子, 则左孩子的编号为2i,右孩子为2i+1。

完全二叉树

深度为 k 的、有 n 个结点的二叉树,当且仅当其每一个结点都与深度为 k 的满二叉树中编号从 1 至 n 的结点一一对应时,称之为完全二叉树。

完全二叉树的特点是:

(1)叶子结点只可能在层次最大的两层上出现;

(2)对任一结点,若其右分支下的子孙的最大层次为 l,则其左分支下的子孙的最大层次必为 l 或 l+1。

没有左子树,不能有右子树,上一层没有铺满,不能有下一层

性质

性质四:具有 n 个结点的完全二叉树的深度为 log2n+1(向下取整)

性质五:如果对一棵有 n 个结点的完全二叉树(其深度为 log2n+1(向下取整))的结点按层序编号(从第 1 层到第 log2n+1 (向下取整层),每层左到右),则对任一结点 i (1 ⩽ i n),以下结论成立。

(1)如果 i=1,则结点 i 是二叉树的根,无双亲;如果结点 i>1则其双亲是结点 i/2(向下取整)

(2)如果 2i>n,则结点 i 无左孩子(结点 i 为叶子结点);否则其左孩子是结点2i

(3)如果 2i+1>n,则结点 i 无右孩子;否则其右孩子的结点是 2i+1。

线索二叉树

通过遍历可以得到二叉树的线性排列 ,但这样线性序列只有在遍历时才能得到

将二叉树线索化得到线索二叉树可以解决这个问题

线索化:利用叶节点的空余空间记录前驱、后继

存储结构

typedef char ElemType;
typedef struct ThreadNode
{ElemType data;struct ThreadNode *lchild;struct ThreadNode *rchild;int ltag;int rtag;
}ThreadNode;
typedef ThreadNode* ThreadTree;

ltag为 0 时,指向该结点左孩子,为 1 时,指向该结点的前驱

rtag为 0 时,指向该结点右孩子,为 1 时,指向该结点的后继

中序遍历线索化

中序遍历:H D I B J E A F C G

1. 头结点的 lchild 指向二叉树的根

2. 头结点的 rchild 指向遍历的最后一个结点(指中序遍历的最后一个节点)

3. 第一个结点的 lchild 指向头结点

4. 最后一个结点的 rchild 指向头结点

真题

题1

解析:

d b c a

答案:

D


题2

解析:

d e b x a c

答案:

D

哈夫曼树

路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径

路径长度:路径上的分支数目

树的路径长度:从树根到每一个结点的路径长度之和

结点的权:在实际应用中,给树中的结点赋予代表某种含义的数值

结点的带权路径长度:从该节点到树根之间的路径长度与该结点权的乘积

树的带权路径长度(WPL):树中所有叶节点的带权路径长度之和

计算WPL

WPL = 5 * 1 + 15 * 2 + 40 * 3 + 30 * 4 + 10 * 4 = 315

定义

带权路径长度 WPL 最小的二叉树称为哈夫曼树。

构造哈夫曼树

1. 先把有权值的叶子结点按照从小到大的顺序排列成一个有序序列

2. 取两个最小权值的结点作为一个新结点 N1 的子结点

3. 将结点 N1 替换刚刚取出的两个结点,并加入到有序序列中

4. 重复步骤 2 ,将 N1 和 “及格”作为一个新结点 N2 的子结点

5. 将结点 N2 替换刚刚取出的两个结点,并加入到有序序列中

6. 重复步骤 2 ,将 N2 和 “良好”作为一个新结点 N3 的子结点

7. 将结点 N3 替换刚刚取出的两个结点,并加入到有序序列中

8. 重复步骤 2 ,将 N3 和 “中等”作为一个新结点 N4 的子结点

WPL = 40 * 1 + 30 * 2 + 15 * 3 + 5 * 4 + 10 * 4 = 205

哈夫曼编码

对 BADCADFEED 进行编码

哈夫曼编码进制串:1001 01 00 101 01 00 1000 11 11 00

原编码二进制串:001 000 011 010 000 011 101 100 100 011

真题

题1


题2


题3


题4

解析:

答案:

A

树与二叉树的转换

树转换成二叉树


1. 加线,在所有兄弟结点之间加一条线


2. 去线,对树中的每一个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线。


3. 层次调整,以树的根结点为轴心,将整棵数顺时针旋转一定角度,使之层次分明。注意第一个

孩子是二叉树结点的左孩子。兄弟转过来的孩子是结点的右孩子。

二叉树转换成树


1. 加线,若某个结点的左孩子存在,则将这个左孩子的所有右孩子结点都作为此结点的孩子,将该结点与这些右孩子结点用线连起来。


2. 去线,删除二叉树中所有结点与其右孩子结点的连线


3. 调整,转一下

森林与二叉树的转换

二叉树转换为森林

第一棵二叉树不动,从第二棵树开始,依次把后一棵二叉树的根结点作为前一棵二 叉树的根结点的右孩子,然后用线连起来

森林转换为二叉树

从根结点开始,若右孩子存在,则把右孩子结点的连线删除。

二叉树转换成树

遍历

树的遍历

森林的遍历

树、森林与二叉树的遍历关系

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

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

相关文章

C#扩展成员全面解析:从方法到属性的演进

本文详细介绍了C#中扩展成员的发展历程,从传统的扩展方法到C# 14中的扩展属性和索引器,通过具体代码示例展示如何更优雅地扩展现有类型功能。C#扩展成员:你需要知道的一切 扩展方法在C#中已经存在很长时间。它们允许…

多机elasticsearch集群部署,超详细教程

假设我们有三台机器,172.24.52.209,172.24.52.210,172.24.52.211。 用户名xjw 三台机器都创建文件夹/home/xjw/docker/learning/elasticsearch,和/home/xjw/docker/learning/kibana,learning为项目名 mkdir -p /h…

DeepSeek 提取 交易所网站核心500词汇(名词与术语)

DeepSeek 提取 交易所网站核心500词汇(名词与术语)交易所网站核心词汇扩充(名词与术语) 1. 市场结构与微观结构 英文术语中文翻译Auction 竞价Opening Auction 开市竞价Volatility Control Mechanism 市场波动调节…

[251122 678mAh] 模拟赛没破防有感 3.0

/hanx我写完 T4 了。 编译运行。 好的,卡住了。 应该是 RE 了。 ?为什么是在输出完答案之后卡住。 (想起了不好的回忆) 诶,别! 别别别别别! 就剩一个小时了别给我干死机了,这次可不是在线提交啊机子还原一下整…

白银市一对一培训机构推荐,2026年最新课外辅导全面测评口碑排名榜

在白银这座教育资源蓬勃发展的城市,从白银区繁华的北京路商圈到平川区快速崛起的会展中心周边,从靖远县文教氛围浓厚的学府街区到会宁县底蕴深厚的教育板块,从景泰县充满活力的新城商圈到皋兰县快速成长的教育园区,…

天水市一对一培训机构推荐,2026最新课外辅导机构口碑深度测评排名榜

在天水市,无论是秦州、麦积两区的繁华都市圈,还是秦安、甘谷、武山、清水、张家川回族自治县等地的莘莘学子,家长们都怀揣着同样的期望:让孩子在接受优质校内教育的同时,能通过课外辅导弥补短板、拔高优势,在求学…

CSAPP bomblab

规则:对于每个\(phase\),你都需要输入一个字符串,使得\(explode\_bomb\)函数不被运行 在bomb目录下使用objdump -d bomb > bomb.s得到反汇编文件\(bomb.s\) \(shell\) 中使用 gdb bomb进入\(gdb\)调试phase_1000…

history of linux

Linux 是一个开源的、跨平台的操作系统,其历史可以追溯到 1991 年。以下是 Linux 的主要发展历史阶段:1. 前身:Minix(1987)开发者:Andrew S. Tanenbaum特点:一个小型、可移植的操作系统内核,主要用于教学。与 …

history linux

当你在 Linux 系统中运行 history 命令时,它会显示你之前执行过的命令历史记录。这个命令是 Shell(如 Bash)内置的,用于跟踪用户在终端中执行过的命令。1. 基本用法history功能:显示当前终端中执行过的命令历史记…

Spring BeanFactoryPostProcessor 接口

[[Spring IOC 源码学习总笔记]] BeanFactoryPostProcessor是 Spring 框架提供的一个扩展点接口,它允许开发者在 Spring 在BeanFactory 加载了所有bean定义,但尚未实例化任何bean 之后,对底层的 BeanDefinition 和 B…

嘉峪关市一对一培训机构推荐,2026年最新课外补习辅导口碑排名

在雄伟的嘉峪关脚下,教育的热潮正席卷这座城市的每个角落。从雄关区的人民商城周边,到长城区的富强路商圈,再到镜铁区的润泽园社区,随处可见家长们为子女教育奔波的身影。小学生的数学思维拓展与语文阅读能力提升,…

2025 AI 教育培训权威推荐榜深度评测排名

2025 AI 教育培训权威推荐榜深度评测排名 痛点深度剖析 我们团队在实践中发现,当前 AI 教育培训领域存在着诸多核心技术挑战。在教学内容方面,AI 技术发展迅猛,知识更新换代极快,很多培训机构的课程内容难以跟上技…

详细介绍:第七篇:匹配篇 | 怎么像做产品一样,为每个岗位“定制”你的简历?

详细介绍:第七篇:匹配篇 | 怎么像做产品一样,为每个岗位“定制”你的简历?2025-11-22 17:40 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow…

2025年布袋除尘器供应商权威推荐榜单:塑烧板除尘器/耐高温除尘器/防爆除尘器源头厂家精选

在环保要求日益严格的工业制造领域,布袋除尘器作为工业粉尘治理的核心设备,其过滤效率与运行稳定性直接关系到企业的环保合规与生产成本。 工业布袋除尘器通过滤袋过滤、脉冲清灰等技术,能有效捕集工业生产中产生的…

hbuilder是否支持云端部署

HBuilder确实支持云端部署。它提供了云端打包功能,允许开发者将项目上传到云端服务器进行打包,生成Android和iOS平台的安装包。以下是HBuilder云端部署的相关信息: HBuilder云端部署支持云端打包功能:HBuilder支持…

创建矩形并让矩形移动

RGB是颜色值 使⽤⼀个元组 (R, G, B) 表示,每个值范围 0-255 。 ⿊⾊: (0, 0, 0) ⽩⾊: (255, 255, 255) 绿⾊: (0, 255, 0) pygame 坐标系 原点 (0, 0):窗⼝的左上⻆。 X 轴:向右增加 Y 轴:向下增加 按下的按键类…

2025年稳定土搅拌站供应商权威推荐榜单:搅拌站回收/二手稳定土搅拌站/二手混凝土土搅拌站源头厂家精选

在基础设施建设持续发展的背景下,稳定土搅拌站作为道路工程、机场跑道等项目的关键设备,其生产效率、混合均匀性与运行稳定性直接关系到工程质量和施工进度。 稳定土搅拌站通过精确的配料系统与高效的搅拌工艺,将水…

blender能量体全息化效果学习

blender能量体全息化效果学习您提供的这个视频是 **Heavenly** 的经典作品《Growing Girl EX PART 1》。我已经分析了视频中角色变大时的视觉效果,这确实不是简单的“边缘发光”,而是一个组合特效。 这个效果在 Blen…

2025教育AI供应商TOP10权威评测:AI时代下的技术赋能与行业变革

2025教育AI供应商TOP10权威评测:AI时代下的技术赋能与行业变革 行业痛点分析 当前AI教育培训领域面临多重技术挑战。数据显示,教育机构在数字化转型过程中普遍存在技术应用效率低下、个性化教学实施困难等问题。测试…

从组件的角度梳理微服务技术栈(1)

微服务技术栈核心组件详解 一、微服务架构概述 微服务架构将单体应用拆分为一组小型、独立的服务,每个服务运行在自己的进程中,通过轻量级机制通信。这种架构带来了部署灵活、技术异构等优势,但也引入了服务发现、通…