数据结构 - 第五章 树与二叉树

定义

树是 n (n≥0) 个结点的有限集。n=0时称为空树。

在任意一棵非空树中:

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

(2)当n>1时,其余结点可分为 m (m>0) 个互不相交的有限集T1、 T2、..... Tm,其中每一个集合本身又是一棵树,并且称为根的子树。

树的结点包含一个数据元素及若干指向其子树的分支。结点拥有的子树数称为结点的度。度为0的结点称为叶结点或终端结点;度不为0的结点称为非终端结点或分支结点。除根结点之外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。

结点的子树的根称为该结点的孩子,该结点称为孩子的双亲。同一个双亲的孩子之间互称兄弟。结点的祖先是从根到该结点所经分支上的所有结点。反之,以某结点为根的子树中的任一结点都称为该结点的子孙

结点的层次从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第 i 层,则其子树的根就在第 i+1 层。其双亲在同一层的结点互为堂兄弟。如果将树中结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序树,否则称为无序树。

森林:m (m≥0) 棵互不相交的树的集合。对树中每个结点而言,其子树的集合即为森林。

 

二叉树

二叉树是n(n≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。

1、每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。注意不是只有两棵子树,而是最多有。没有子树或者有一棵子树都是可以的。

2、左子树和右子树是有顺序的,次序不能任意颠倒。即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。

斜树:所有的结点都只有一边的子树。所有的结点都只有左子树的二叉树叫左斜树。所有结点都是只有右子树的二叉树叫右斜树。

满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上。

完全二叉树:对一棵具有n个结点的二叉树按层序编号,如果编号为i (1

遍历

二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。

1、前序遍历:规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。

2、中序遍历:规则是若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树。

3、后序遍历:规则是若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访向左右子树,最后是访问根结点。

4、层序遍历:规则是若树为空,则空操作返回,否则从树的第一层, 也就是根结点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。

 

树和森林

树转化为二叉树

1、加线。在所有兄弟结点之间加一条连线。
2、去线。对树中每个结点,只保留它与第一个孩子结点的连线,删除它与其他孩子结点之间的连线。
3、层次调整。以树的根结点为轴心,将整棵树顺时针旋转一定的角度, 使之结构层次分明。注意第一个孩子是二叉树结点的左孩子,兄弟转换过来的孩子是结点的右孩子。

森林转化为二叉树

1、把每个树转换为二叉树。
2、第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来。当所有的二叉树连接起来后就得到了由森林转换来的二叉树。

二叉树转化为树

1、加线。若某结点的左孩子结点存在,则将这个左孩子的右孩子结点、右孩子的右孩子结点……n个右孩子结点都作为此结点的孩子。将该结点与这些右孩子结点用线连接起来。
2、去线。删除原二叉树中所有结点与其右孩子结点的连线。
3、层次调整。使之结构层次分明。

二叉树转化为森林

1、从根结点开始,若右孩子存在,则把与右孩子结点的连线删除,再查看分离后的二叉树,若右孩子存在,则连线删除....直到所有右孩子连线都删除为止,得到分离的二叉树。
2、再将每棵分离后的二叉树转换为树即可。

树的遍历分为两种方式:

1、一种是先根遍历树,即先访问树的根结点,然后依次先根遍历根的每棵子树。
2、另一种是后根遍历,即先依次后根遍历每棵子树,然后再访问根结点。

森林的遍历也分为两种方式:

1、前序遍历:先访问森林中第一棵树的根结点,然后再依次先根遍历根的每棵子树,再依次用同样方式遍历除去第一棵树的剩余树构成的森林。
2、后序遍历:是先访问森林中第一棵树,后根遍历的方式遍历每棵子树,然后再访问根结点,再依次同样方式遍历除去第一棵树的剩余树构成的森林。

森林的前序遍历和二叉树的前序遍历结果相同,森林的后序遍历和二叉树的中序遍历结果相同。当以二叉链表作树的存储结构时,树的先根遍历和后根遍历完全可以借用二叉树的前序遍历和中序遍历的算法来实现。

 

哈夫曼树

数据结构 - 第五章 树与二叉树_第1张图片

从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称做路径长度。树的路径长度就是从树根到每一结点的路径长度之和。如果考虑到带权的结点,结点的带权的路径长度为从该结点到树根之间的路径长
度与结点上权的乘积。树的带权路径长度为树中所有叶子结点的带权路径长度之和。其中带权路径长度WPL最小的
二叉树称做赫夫曼树。

哈弗曼编码

哈夫曼的重要应用就是解决当年远距离通信(主要是电报)的数据传输的最优化问题。

数据结构 - 第五章 树与二叉树_第2张图片

编码中非0即1,长短不等的话其实是很容易混淆的,所以若要设计长短不等的编码,则必须是任一字符的编码都不是另一个字符的编码的前缀,这种编码称做前缀编码。

一般地,设需要编码的字符集为{ d1,d2,…,dn }, 各个字符在电文中出现的次数或频率集合为{ w1,w2,…,wn },以 d1,d2,…,dn 作为叶子结点,以 w1,w2,…,wn 作为相应叶子结点的权值来构造一棵赫夫曼树。规定赫夫曼树的左分支代表0,右分支代表1,则从根结点到叶子结点所经过的路径分支组成的0和1的序列便为该结点对应字符的编码,这就是赫夫曼编码。

 

参考教材:

《数据结构与算法》,熊岳山著,清华大学出版社,2016,第二版

《2020年数据结构考研复习指导》,电子工业出版社,2020

你可能感兴趣的:(数据结构)