数据结构 5树/图

遍历总结

(1)树:
(有序/无序)树、森林的先序遍历 对应二叉树的先序遍历
(有序/无序)树、森林的后序遍历 对应二叉树的中序遍历

森林没有中序(或者说森林的中序等同于后序),
森林的后(中)/先序等同于树的中/先序
树没有中序遍历

树的先序和后序⇒不能构造出该树
要构造一棵树,必须知道它的中序遍历

1、前序+中序
2、后序+中序
3、层序+中序
知道以上3种情况的任意一种都可以构造出该树


(2)图:
图(和树)的广度搜索遍历⇔二叉树的层次遍历
图的深度优先遍历⇔二叉树的先序遍历


基本概念

树的结点数目可以为0(可以为空树)

(1-1)结点:
不仅包含数据元素,而且包含指向子树的分支(指向子树的指针)

叶子(终端/外部)结点:
度为0的结点

非终端(分支)结点:
度不为0的结点称为非终端结点(内部节点)
包括根节点

中间结点(非根非叶结点)

(1-2)结点/树的度:

结点拥有的子树个数或者分支的个数称为结点的度;

树中各结点度的最大值。

(1-3)层次、高度(深度)、森林:
①层次:从根开始,根为第一层,根的孩子为第二层,以此类推。

②树的高度(深度):树中结点的最大层次

③森林:若干棵互不相交的树的集合


树的存储结构

顺序-双亲存储结构(一维数组)

用数组下标表示树中的结点,数组元素的内容表示该结点的双亲结点


(2)链式
①孩子存储

②孩子兄弟存储


二叉树

①每个结点最多只有两颗子树

②子树有左右顺序之分

③N₀=N₂+1

④n个结点,能构成C²ⁿₙ/(n+1)种不同的二叉树



1.满二叉树

所有的分支结点都有左孩子和右孩子结点,且所有的叶子结点都集中在二叉树的最下一层


2.完全二叉树

①除最后一层可能不满以外,其他各层都达到该层结点的最大值

②最后一层如果不满,则该层结点从左到右顺序排列


考点

1:n个结点的完全二叉树深度
( log₂n下取整)+1 [log₂(n+1)上取整]

证明天勤136

2:n个叶子结点的完全二叉树深度
①存在度数为1的结点 (log₂2n下取整)+1
②不存在度数为1的结点(log₂2n-1下取整)+1


3:n个结点的折半查找的判定树的深度⇒等同于完全二叉树的深度


3.结点编号(1~n)
双亲-孩子

结点a编号为i⇒
①双亲编号为(i/2下取整)
②左孩子编号为2i(如果有)


从下到上第一个内部结点:n/2
证明①有/无单分支②减去叶子数

应用

1:完全二叉树可以用来构造堆进行排序


3.二叉树存储结构

(1)顺序存储

(2)链式存储

①二叉链表
链表中结点的两个链域分别指向该结点的第一个孩子结点和第二个孩子结点

n个结点时有n+1个空的指针
方法一:
总指针域-结点指针域;而结点指针域有n-1个
⇒2n-(n-1)=n+1
因为n-1个结点有父亲结点(相应的,有n-1个指针域指向这些结点)

方法二:
空指针数:2N₀+N₁=N₀+N₁+N₂+1=n+1

②三叉链表
三叉链表相对于二叉链表,其第三个指针用来指向双亲。

n个结点时,有n+2个空指针。
因为只有根无双亲,所以相较于二叉链表又多出一个空的指针,则总的空指针为n+2。

实现任意二叉树的后序遍历的非递归算法而不使用栈结构,选择三叉链表(结点可以指向双亲)


4.二叉树的遍历

二叉树的遍历结果可能不唯一

(1)中序遍历

(2)中序遍历

(3)后序遍历

(4)层次遍历
对二叉树进行层次遍历借助于一个循环队列

5.线索二叉树

引入二叉线索树的目的:
加快查找结点的前驱或后继的速度
不使用递归就可进行遍历

不能使遍历结果唯一

6.特殊二叉树

(1)一颗二叉树的先序遍历和后序遍历相反
⇔高度等于结点数⇔每层一个结点

(2)高度为h的二叉树只有度为0和度为2的结点,则其至少有2h-1个结点
除了第h层,每层度为2的节点只有1个(2个子结点),共有2(h-1)个,再加根节点总共2h-1个。
也可代入特殊情况(只有根节点)


7.有序树

树中任意节点的子结点之间有顺序关系,这种树称为有序树

可以理解成层次遍历编号
如第一层A,第二层有BCD,第三层有EF

考点:求有序树与其转化的二叉树遍历关系
方法一:①先画出一个有序树(层次遍历序号ABCDEF)
②再转化成二叉树

方法二:根据树与二叉树的遍历对应规则来选择


树⇔二叉树⇔森林

默认采用孩子兄弟链表法(方便转化)

树⇔二叉树
(1)树→二叉树

原理:①相邻兄弟连线
②删除双亲与非第一个孩子的连线
③兄弟变右子树,孩子变左子树

由于根节点一定没有右兄弟,所以转换后的二叉树根节点一定没有右孩子

(2)二叉树→树
原理:①右孩子变兄弟并连线
②双亲与(非第一个孩子)连线
③删除结点与兄弟连线

二叉树⇔森林
(1)二叉树→森林

①将所有根节点有右孩子的二叉树的右孩子链接断开
②再将多棵二叉树转化为树

(2)森林→二叉树
①将森林中的树转换为二叉树
②将第二棵二叉树作为第一棵二叉树根的右子树,将第三棵树作为第二棵树的右子树…

若由森林转化的二叉树非空,则二叉树的形状是:根节点可能有左子树和右子树(考察树→二叉树与森林→二叉树是否混淆)


5.赫夫曼树(最优二叉树)和赫夫曼编码

赫夫曼树默认二叉,也可以多叉

哈夫曼二叉树又称作最优二叉树:
n个带权叶子结点构成的所有二叉树中,带权路径长度最小的二叉树。

外部路径长度(值=WPL):从二叉树的根到每个外部结点(叶结点)的路径长度之和称为外部路径长度(E)
赫夫曼树是(访问叶子结点的)外部路径长度最短的二叉树

树的带权路径长度WPL:树的带权路径长度是指树中所有叶子结点的带权路径长度之和

(1)路径长度、带权路径长度:

路径长度:
路径(结点到另一个结点的分支所构成的路线)上的分支数目

结点带权路径长度:
结点具有权值,从该点到根之间的路径长度乘以结点的权值,就是该结点的带权路径长度


(2)考点

1:Huffman树的权值全部在叶子上,那些分支的权值仅仅供构造算法使用的,其实是没有权值的

2:赫夫曼树不是完全二叉树,严格来说不是完全m叉树

3:赫夫曼树的结点个数不能是偶数



发布了46 篇原创文章 · 获赞 15 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41850194/article/details/100732122
今日推荐