第五章——树与二叉树

一、树的基本概念

1、树的定义

树是n(n≥0)个结点的有限集合,n = 0时,称为空树,这是一种特殊情况。在任意一棵非空树中应满足:
1)有且仅有一个特定的称为根的结点。
2)当n > 1时,其余结点可分为m(m > 0)个互不相交的有限集合T1, T2,…, Tm,其中每个集合本身又是一棵树,并且称为根结点的子树。



空树——结点数为0的树
非空树的特性:

  • 有且仅有一个根节点
  • 没有后继的结点称为“叶子结点”(或终端结点)
  • 有后继的结点称为“分支结点”(或非终端结点)
  • 除了根节点外,任何一个结点都有且仅有一个前驱
  • 每个结点可以有0个或多个后继。

2、基本术语

结点的层次(深度)——从上往下数
结点的高度——从下往上数
树的高度(深度)——总共多少层
结点的度——有几个孩子(分支)
树的度——各结点的度的最大值
有序树——逻辑上看,树中结点的各子树从左至右是有次序的,不能互换
无序树——逻辑上看,树中结点的各子树从左至右是无次序的,可以互换
森林:森林是m(m≥0)棵互不相交的树的集合
考点:森林和树相互转化问题


小结

3、树的性质

常见考点1:结点数=总度数+1
结点的度——结点有几个孩子(分支)
常见考点2:度为m的树、m叉树 的区别


度为m的树、m叉树 的区别

常见考点3:度为m的树第 i 层至多有 m的i次方-1 个结点(i≥1)
m叉树第 i 层至多有 mi-1 个结点(i≥1)


图示

常见考点4:高度为h的m叉树至多有多少个结点
图示

常见考点5:高度为h的m叉树至少有 h 个结点。
高度为h、度为m的树至少有 h+m-1 个结点。
图示

常见考点6:具有n个结点的m叉树的最小高度为 【logm(n(m - 1) + 1)】


图示

小结考点
小结考点

二、二叉树的概念

1、二叉树的定义及其主要特性

二叉树是n(n≥0)个结点的有限集合:
① 或者为空二叉树,即n = 0。
② 或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树。
特点:①每个结点至多只有两棵子树 ②左右子树不能颠倒(二叉树是有序树)

  • 二叉树是递归定义的数据结构

二叉树的五种状态

二叉树的五种状态

满二叉树:一棵高度为h,且含有2h - 1个结点的二叉树
特点:
①只有最后一层有叶子结点
②不存在度为 1 的结点
③按层序从 1 开始编号,结点 i 的左孩子为 2i,右孩子为 2i+1;结点 i 的父节点为【i/2】(如果有的话)


满二叉树

完全二叉树:当且仅当其每个结点都与高度为h的满二叉树中编号为1~n的结点一一对应时,称为完全二叉树。
特点:
①只有最后两层可能有叶子结点
②最多只有一个度为1的结点
③按层序从 1 开始编号,结点 i 的左孩子为 2i,右孩子为 2i+1;结点 i 的父节点为【i/2】(如果有的话)
④ i≤ n/2 为分支结点, i> n/2 为叶子结点
完全二叉树:如果某结点只有一个孩子,那么一定是左孩子,若只有右孩子,而没有左孩子,那么,则不为完全二叉树。
二叉排序树。一棵二叉树或者是空二叉树,或者是具有如下性质的二叉树:
左子树上所有结点的关键字均小于根结点的关键字;
右子树上所有结点的关键字均大于根结点的关键字。
左子树和右子树又各是一棵二叉排序树。
左子树和右子树又各是一棵二叉排序树。

  • 二叉排序树可用于元素的排序、搜索。
    平衡二叉树:树上任一结点的左子树和右子树的深度之差不超过1。

小结
二叉树小结

二叉树的常考性质

常见考点1:设非空二叉树中度为0、1和2的结点个数分别为n0、n1和n2,则 n0 = n2 + 1
(叶子结点比二分支结点多一个)
假设树中结点总数为 n,则
① n = n0 + n1 + n2
② n = n1 + 2n2 +1(树的结点数=总度数+1 )
② - ①:n0 = n2 + 1
常见考点2:二叉树第 i 层至多有 2的i-1次方个结点(i≥1)
m叉树第 i 层至多有 m的i-1次方个结点(i≥1)
常见考点3:高度为h的二叉树至多有 2的ℎ次方 − 1个结点(满二叉树)


考点三

完全二叉树的常考性质

常见考点1:具有n个(n > 0)结点的完全二叉树的高度h。
高为 h 的满二叉树共有 2的ℎ次方 − 1 个结点
高为 h-1 的满二叉树共有 2的h-1次方− 1个结点
常见考点2:对于完全二叉树,可以由的结点数 n 推出度为0、1和2的结点个数为n0、n1和n2
完全二叉树最多只有一个度为1的结点,即n1=0或1
n0 = n2 + 1→n0 + n2 一定是奇数
若完全二叉树有2k个(偶数)个结点,则必有 n1=1, n0 = k, n2 = k-1
若完全二叉树有2k-1个(奇数)个结点,则必有 n1=0, n0 = k, n2 = k-1

考点小结

二叉树:
• n0 = n2 + 1
• 第 i 层至多有 2i-1 个结点(i≥1)
• 高度为h的二叉树至多有 2ℎ − 1个结点
完全二叉树:
• 具有n个(n > 0)结点的完全二叉树的高度h为log2(n + 1)或log2n+ 1
• 对于完全二叉树,可以由的结点数 n 推出为0、1和2的结点个数为n0、n1
和n2(突破点:完全二叉树最多只会有一个度为1的结点)

2、二叉树的存储结构

二叉树的顺序储存

顺序储存
  • 二叉树的顺序存储中,一定要把二叉树的结点编号与完全二叉树对应起来


    节点编号对应

二叉树的链式储存

二叉树的链式储存

三叉链表
  • n个结点的二叉链表共有 n+1 个空链域

三、二叉树的遍历和线索二叉树

1、二叉树的遍历

  • 遍历:按照某种次序把所有结点都访问一遍
    层次遍历:基于树的层次特性确定的次序规则
    先/中/后序遍历:基于树的递归特性确定的次序规则

先序遍历:根左右(NLR)

先序遍历(PreOrder)的操作过程如下:

  1. 若二叉树为空,则什么也不做;
  2. 若二叉树非空:
    ①访问根结点;
    ②先序遍历左子树;
    ③先序遍历右子树。

中序遍历:左根右(LNR)

中序遍历(InOrder)的操作过程如下:

  1. 若二叉树为空,则什么也不做;
  2. 若二叉树非空:
    ①先序遍历左子树;
    ②访问根结点;
    ③先序遍历右子树。

后序遍历:左右根(LRN)

后序遍历(InOrder)的操作过程如下:

  1. 若二叉树为空,则什么也不做;
  2. 若二叉树非空:
    ①先序遍历左子树;
    ②先序遍历右子树;
    ③访问根结点。


    先、中、后序遍历图示

    结合算术表达式的遍历

考点小结

考点小结

二叉树层次遍历

二叉树的层次遍历

算法思想:
①初始化一个辅助队列
②根结点入队
③若队列非空,则队头结点出队,访问该结点,并将其左、右孩子插入队尾(如果有的话)
④重复③直至队列为空

2、线索二叉树

中序线索二叉树的储存

三种线索二叉树的对比

重要考点


重要考点

四、树、森林

1、树的存储结构

树是n(n≥0)个结点的有限集合,n = 0时,称为空树,这是一种特殊情况。在任意一棵非
空树中应满足:
1)有且仅有一个特定的称为根的结点。
2)当n > 1时,其余结点可分为m(m > 0)个互不相交的有限集合T1, T2,…, Tm,其中每个集合本身又是一棵树,并且称为根结点的子树。

双亲表示法(顺序储存)

双亲表示法

孩子表示法(顺序+链式存储)

孩子表示法

孩子兄弟表示法(链式存储)

将树转化为二叉树,左孩子右兄弟


树的储存结构

2、树、森林与二叉树的转换

将树转化为二叉树,左孩子右兄弟。

3、树和森林的遍历

树的先根遍历

先根遍历。若树非空,先访问根结点,再依次对每棵子树进行先根遍历。

*树的先根遍历序列与这棵树相应二叉树的先序序列相同。

树的后根遍历

后根遍历。若树非空,先依次对每棵子树进行后根遍历,最后再访问根结点。

*树的后根遍历序列与这棵树相应二叉树的中序序列相同。

树的层次遍历

层次遍历(用队列实现)
①若树非空,则根节点入队
②若队列非空,队头元素出队并访问,同时将该元素的孩子依次入队
③重复②直到队列为空

森林的先序遍历

先序遍历森林。
若森林为非空,则按如下规则进行遍历:
访问森林中第一棵树的根结点。
先序遍历第一棵树中根结点的子树森林。
先序遍历除去第一棵树之后剩余的树构成的森林。

  • 效果等同于依次对二叉树的先序遍历

森林的中序遍历( 实则个人所认为的后序遍历)

中序遍历森林。
若森林为非空,则按如下规则进行遍历:
中序遍历森林中第一棵树的根结点的子树森林。
访问第一棵树的根结点。
中序遍历除去第一棵树之后剩余的树构成的森林。

*效果等同于依次对二叉树的中序遍历

小结
小结

4、树的应用——并查集

五、树与二叉树的应用

1、二叉排序树(BST)

二叉排序树,又称二叉查找树(BST,Binary Search Tree)
一棵二叉树或者是空二叉树,或者是具有如下性质的二叉树:
左子树上所有结点的关键字均小于根结点的关键字;
右子树上所有结点的关键字均大于根结点的关键字。
左子树和右子树又各是一棵二叉排序树。

左子树结点值 < 根结点值 < 右子树结点值
进行中序遍历,可以得到一个递增的有序序列

小结

2、平衡二叉树

平衡二叉树——树上任一结点的左子树和右子树的深度之差不超过1。
查找长度——在查找运算中,需要对比关键字的次数称为查找长度。

平衡二叉树的插入

每次调整的对象都是“最小不平衡子树”

在插入操作中,只要将最小不平衡子树调整平衡,则其他祖先结点都会恢复平衡


调整最小不平衡子树

1)LL平衡旋转(右单旋转)。


LL平衡旋转

由于在结点A的左孩子(L)的左子树(L)上插入了新结点,A的平衡因子由1增至2,导致以A为根的子树失去平衡,需要一次向右的旋转操作。将A的左孩子B向右上旋转代替A成为根结点,将A结点向右下旋转成为B的右子树的根结点,而B的原右子树则作为A结点的左子树。
2)RR平衡旋转(左单旋转)。


RR平衡旋转

由于在结点A的右孩子(R)的右子树(R)上插入了新结点,A的平衡因子由-1减至-2,导致以A为根的子树失去平衡,需要一次向左的旋转操作。将A的右孩子B向左上旋转代替A成为根结点,将A结点向左下旋转成为B的左子树的根结点,而B的原左子树则作为A结点的右子树
3)LR平衡旋转(先左后右双旋转)。
LR平衡旋转

LR平衡旋转

由于在A的左孩子(L)的右子树(R)上插入新结点,A的平衡因子由1增至2,导致以A为根的子树失去平衡,需要进行两次旋转操作,先左旋转后右旋转。先将A结点的左孩子B的右子树的根结点C向左上旋转提升到B结点的位置,然后再把该C结点向右上旋转提升到A结点的位置
4)RL平衡旋转(先右后左双旋转)。


RL平衡旋转

RL平衡旋转

由于在A的右孩子(R)的左子树(L)上插入新结点,A的平衡因子由-1减至-2,导致以A为根的子树失去平衡,需要进行两次旋转操作,先右旋转后左旋转。先将A结点的右孩子B的左子树的根结点C向右上旋转提升到B结点的位置,然后再把该C结点向左上旋转提升
到A结点的位置

小结
小结

知识回顾

3、哈夫曼树和哈夫曼编码

结点的权:有某种现实含义的数值(如:表示结点的重要性等)
结点的带权路径长度:从树的根到该结点的路径长度(经过的边数)与该结点上权值的乘积
树的带权路径长度:树中所有叶结点的带权路径长度之和(WPL, Weighted Path Length)

  • 在含有n个带权叶结点的二叉树中,其中带权路径长度(WPL)最小的二叉树称为哈夫曼树,也称最优二叉树


    哈夫曼树

哈夫曼树的构造

给定n个权值分别为w1, w2,…, wn的结点,构造哈夫曼树的算法描述如下:
1)将这n个结点分别作为n棵仅含一个结点的二叉树,构成森林F。
2)构造一个新结点,从F中选取两棵根结点权值最小的树作为新结点的左、右子树,并且将新
结点的权值置为左、右子树上根结点的权值之和。
3)从F中删除刚才选出的两棵树,同时将新得到的树加入F中。
4)重复步骤2)和3),直至F中只剩下一棵树为止。

1)每个初始结点最终都成为叶结点,且权值越小的结点到根结点的路径长度越大
2)哈夫曼树的结点总数为2n − 1
3)哈夫曼树中不存在度为1的结点。
4)哈夫曼树并不唯一,但WPL必然相同且为最优

哈夫曼编码

固定长度编码——每个字符用相等长度的二进制位表示


固定长度

可变长度
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容