树
-
一个结点拥有的子树的数目称为结点的度,例:(A(B,C,D))所以A的度为 3
-
度不为0 的结点称为:非终端结点或分支结点
-
度为0的结点称为:终端结点 或 叶子结点
-
树的最大层次为树的高度或深度
-
路径的长度:是路线上所经过边的数目
-
左孩子有兄弟表示法:将有左边的孩子结点来接管父结点其余的孩子结点
下面是一颗森林转化为一棵二叉树
(这图F位置错的,待改)
若果要将二叉树转化为一棵森林的话; -
一个结点不断的向右子树走直到走到的当前那个结点没有右子树为止,那么沿途经过的都是他的兄弟结点
如:B结点,往右子树走到D结点就停下了,途中经过:B,C,D
-
一个结点不断的向左子树走直到走到的当前那个结点没有左子树为止,那么沿途经过的都是他的兄弟结点
如:B结点,往左子树走到K结点就停下来,(不包含本身)经过:E,F,K
二叉树的性质
1. 第 i 层的节点数最多只有
2. 深度为 k的二叉树最多有:
3. 对与任何二叉树,若度为2的结点有 n 个 则叶子结点必有 n+1 个
4. 有结点数为 n 的完全二叉树 有深度数为:
5. 结点:i , 左孩子编号:2i,右孩子:2i+1,父亲结点:i/2
二叉树遍历
先序遍历:8、3 、6、 4、 7 、10 、14 、13
中序遍历:1、3、4、6、7、8、10、13、14
后续遍历:1、4、7、6、3、13、14、10、8
由遍历顺序复原出二叉树方法:
中与先:
1)由先序知道 ‘ 8 ’ 为根结点,然后在中序中可以先找8:
中序遍历:1、3、4、6、7、8、10、13、14
显然8把这组数据分成了左右部分,他们也分别表示8结点的左右树的结点;
2)接下由先序 得 ‘ 3 ’ 结点,有因为第一部操作知道3是在8左边,所以3是8的左孩子,然后再从3分割又由中序的数据得知,3左边只有一个结点‘1’,右节点有‘4’,‘6’
中序遍历:1、3、4、6、7、8、10、13、14
3)‘接下先序6’结点,在中序中分割,4在6左边,7在6的右边
中序遍历:1、3、4、6、7、8、10、13、14
以此类推
赫夫曼树
树的带权路径最小,运算效率高
今天做题的时候,遇到了一个关于哈夫曼树的题,由于一直不是很明白哈夫曼树的构造过程,所以找了很多资料都不是特别清楚的,直到我遇到了这篇文章,哈哈,在此分享给大家哦!
注意:哈夫曼树并不唯一,但带权路径长度一定是相同的。
(1)8个结点的权值大小如下:
(2)从19,21,2,3,6,7,10,32中选择两个权小结点。选中2,3。同时算出这两个结点的和5。
(3)从19,21,6,7,10,32,5中选出两个权小结点。选中5,6。同时计算出它们的和11。
(4)从19,21,7,10,32,11中选出两个权小结点。选中7,10。同时计算出它们的和17。
(BTW:这时选出的两个数字都不是已经构造好的二叉树里面的结点,所以要另外开一棵二叉树;或者说,如果两个数的和正好是下一步的两个最小数的其中的一个,那么这个树直接往上生长就可以了,如果这两个数的和比较大,不是下一步的两个最小数的其中一个,那么就并列生长。)
(5)从19,21,32,11,17中选出两个权小结点。选中11,17。同时计算出它们的和28。
(6)从19,21,32,28中选出两个权小结点。选中19,21。同时计算出它们的和40。另起一颗二叉树。
(7)从32,28, 40中选出两个权小结点。选中28,32。同时计算出它们的和60。
(8)从 40, 60中选出两个权小结点。选中40,60。同时计算出它们的和100。 好了,此时哈夫曼树已经构建好了。