一、二叉树性质
二、特殊二叉树
1、斜树:
2、满二叉树:
3、完全二叉树:
完全二叉树就是除了最后一层,其余的都是满二叉树,最后一层的节点都连续靠左(也即,不能存在有右节点,而没有左节点得情况)。深度为n的完全二叉树的最少的节点数为:[2^(n-1) -1 ] + 1
注意: 因为最后一层不是满的,所以倒数第二层也露出了一些节点,那些节点也算是叶子节点!
4、线索二叉树
对二叉树以某种次序遍历使其变为线索二叉树的过程称做是线索化,这样对我们的插入删除结点、查找某个结点都带来了方便。线索二叉树的线索数就是空指针域的数目。
若有n个节点的线索二叉树,每个节点都有指向左右孩子的两个指针域,则共有2n个指针域,而n个节点共有n-1条分支,所以共有2n-(n-1)个空指针域,即有n+1个线索。
5、扩充二叉树
对给定的二叉树,对其中不足两个孩子的节点(包括叶子节点)添加外部附加节点,使得每个节点都有两个孩子节点,所得的二叉树称为原二叉树的扩充二叉树。原节点称为内部节点,新加的节点称作外部节点。对于具有n个内部节点的二叉树,其外部节点个数为 n+1
6、哈夫曼树(Huffman Tree)又称“最优二叉树”
从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上分支数目称作路径长度 每经过一个节点,路径长度都得加1。树的路径长度就是从根到每一结点的路径长度之和。
树的带权路径长度(记为“WPL”)为树中所有叶子节点的 带权路径长度之和。我们把 带权路径长度 WPL 最小的二叉树称做哈弗曼树。上述哈弗曼树 WPL=7 * 1 + 5 * 2 + 2 * 3 + 4 * 3,一般情况下,权值越大的叶子离根越近,那么二叉树的WPL就越小
4个节点k1 k2 k3 k4,分别带权10 16 20 6利用他们做外部节点构造huffman树,求其带权路径长度之和即WPL?
解释:4个外节点,则有3个内部节点,看5、6可知。
有序树:树中任意节点的子结点之间有顺序关系,这种树称为有序树
无序树:树中任意节点的子结点之间没有顺序关系,这种树称为无序树,也称为自由树
换而言之,兄弟结点有顺序的树,称为有序树,兄弟之间无顺序的树称为无序树。
三、遍历二叉树
【例题1】
一颗二叉树的前序遍历是ABCDFGHE,后序遍历是BGHFDECA,中序遍历是?
(A): GHBADFCE
(B): DGBAFHEC
(C): BADGFHCE
(D): BAGDFHEC
正确答案: C(更改此处颜色可看答案)
解析:给定的是先序和后序遍历序列则不能还原二叉树。
由前序遍历我们可以得到:A为整棵树的根节点,E为整棵树最右边的节点;
由后序遍历我们可以得到:B为整棵树最左边的节点
四、二叉树、树、森林转换
将树转换为二叉树的步骤如下
1、加线。在所有兄弟结点之间加一条连线。
2、去线。对树中每个结点,只保留它与第一个孩子结点的连线,删除它与其他孩子结点之间的连线。
3、层次调整。以树的根结点为轴心,将整棵树顺时针旋转一定的角度,使之结构层次分明。
注意第一个孩子是二又树结点的左孩子,兄弟转换过来的孩子是结点的右孩子。
将森林转换为二叉树的步骤如下
1、把每个树转换为二叉树。
2、第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来。当所有的二叉树连接起来后就得到了由森林转换来的二叉树。
将二叉树转换为树步骤如下:
1、加线。若某结点的左孩子结点存在,则将这个左孩子的右孩子结点、右孩子的右孩子结点、右孩子的右孩子的右孩子结点……哈,反正就是左孩子的n个右孩子结点都作为此结点的孩子。将该结点与这些右孩子结点用线连接起来。
2、去线。删除原二又树中所有结点与其右孩子结点的连线。
3、层次调整。使之结构层次分明。
将二叉树转换为树步骤如下:
判断一棵二叉树能够转换成一棵树还是森林,标准很简单,那就是只要看这棵二叉树的根结点有没有右孩子,有就是森林,没有就是一棵树。那么如果是转换成森林,步骤如下:
1、从根结点开始,若右孩子存在,则把与右孩子结点的连线删除,再查看分离后的二叉树,若右孩子存在,则连线删除……,直到所有右孩子连线都删除为止,得到分离的二叉树。
2、再将每棵分离后的二叉树转换为树即可。