大家好,我是加摩斯,觉得文章有帮助的小伙伴,记得一键三连哟~
申明:原创,转载前请与我沟通。
树的递归定义:
- 根结点
- 除根结点外的其它结点被分成n个不相交的集合
T1,T2,...,Tn
,其中每个集合本身是一棵树,树T1,T2,...,Tn
,称为根的子树。
树的性质和基本概念:
- 树的结点数等于所有结点的度数加1;
- 度为m的树中第i层上至多有
m^(i-1)
个结点; - 高度为h的m叉树至多有
(m^h-1)/(m-1)
个结点;(等比数列1+m+m^2+……
) - 具有n个结点的m叉树的最小高度为
logmn(m-1)+1
。
二叉树的非递归遍历是难点:
非递归遍历二叉树的方法是线索二叉树(Threaded Binary Tree
)方法,线索二叉树利用二叉树空指针域存放指向前驱和后继的结点,线索二叉树根据线索性质不同可分为:前序线索二叉树、中序线索二叉树和后序线索二叉树。
注:线索链表解决了无法直接找到该结点在某种遍历序列中的前趋和后继结点的问题,出现了二叉链表找左、右孩子困难的问题。
森林转换成二叉树:
由于树或者森林可以通过孩子兄弟表示法转换为二叉树,这样只需要研究二叉树的性质就行了。
树转换为二叉树
-
加线。在所有兄弟结点之间加一条连线。
-
去线。树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线。
-
层次调整。以树的根节点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明。(注意第一个孩子是结点的左孩子,兄弟转换过来的孩子是结点的右孩子)
森林转换为二叉树
- 把每棵树转换为二叉树。
- 第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来。
二叉树转换为树
是树转换为二叉树的逆过程。
- 加线。若某结点X的左孩子结点存在,则将这个左孩子的右孩子结点、右孩子的右孩子结点、右孩子的右孩子的右孩子结点…,都作为结点X的孩子。将结点X与这些右孩子结点用线连接起来。
- 去线。删除原二叉树中所有结点与其右孩子结点的连线。
- 层次调整。
二叉树转换为森林
假如一棵二叉树的根节点有右孩子,则这棵二叉树能够转换为森林,否则将转换为一棵树。
- 从根节点开始,若右孩子存在,则把与右孩子结点的连线删除。再查看分离后的二叉树,若其根节点的右孩子存在,则连线删除…。直到所有这些根节点与右孩子的连线都删除为止。
- 将每棵分离后的二叉树转换为树。
huffman树的构造和huffman编码:
从给定的序列中找出最小的两个,构成一棵树的两个叶结点,根结点为两个数字相加,将相加之后的结果,添加到序列中,重复上述步骤,最终形成的二叉树就是huffman树。
- 对给定的n个权值
{W1,W2,W3,...,Wi,...,Wn}
构成n棵二叉树的初始集合F={T1,T2,T3,...,Ti,...,Tn}
,其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空