平衡二叉树与哈夫曼树(5)

有了二叉排序树就可以使插入、搜索效率大大提高了,为什么还要引入平衡二叉树?

二叉搜索树的结构与值的插入顺序有关,同一组数,若其元素的插入顺序不同,二叉搜索树的结构是千差万别的。举个例子,给出一组数[1,3,5,8,9,13]。

平衡二叉树与哈夫曼树(5)_第1张图片

 

 若按照[1,3,5,8,9,13]这样的顺序插入

平衡二叉树与哈夫曼树(5)_第2张图片

 

 

如果在上面的二叉搜索树中查找13,是要将所有节点都遍历一遍的,时间复杂度就变成了O(n),几乎就是一个链表。

为了避免二叉搜索树变成“链表”,我们引入了平衡二叉树,即让树的结构看起来尽量“均匀”,左右子树的节点数尽量一样多。

平衡二叉树的定义:

平衡二叉树,又称AVL树,指的是左子树上的所有节点的值都比根节点的值小,而右子树上的所有节点的值都比根节点的值大,

且左子树与右子树的高度差最大为1。因此,平衡二叉树满足所有二叉排序(搜索)树的性质。

 

那给定插入序列,如何生成一棵平衡二叉树呢?

先按照生成二叉搜索树的方法构造二叉树,直至二叉树变得不平衡,即出现这样的节点:左子树与右子树的高度差大于1。

主要有四种调整方式:LL(左旋)、RR(右旋)、LR(先左旋再右旋)、RL(先右旋再左旋)。

但是在平衡二叉树调整的时候,往往使用旋转的方式,效果不明显。因此我使用下面的方式进行处理

1)从树根部开始取3个平衡的点【4,8,11】

2)进行中序遍历,取出3点钟的中位数字【8】

3)按照树根在二叉树的性质下,排列

平衡二叉树与哈夫曼树(5)_第3张图片

 

 

哈夫曼树: 

一般来说,用n(n>0)个带权值的叶子来构造二叉树,限定二叉树中除了这n个叶子外只能出现度为2的结点。那么符合这样条件的二叉树往往可构造出许多颗,其中带权路径长度最小的二叉树就称为哈夫曼树或最优二叉树

展示哈夫曼树的构建过程:

平衡二叉树与哈夫曼树(5)_第4张图片

 

 平衡二叉树与哈夫曼树(5)_第5张图片

 

构建新的树:

 平衡二叉树与哈夫曼树(5)_第6张图片

 

 

最后:

平衡二叉树与哈夫曼树(5)_第7张图片

 

 总结为:总是将最大的权值放在离根节点最近的地方,将权值最小的放在叶子上。

 

你可能感兴趣的:(平衡二叉树与哈夫曼树(5))