数据结构之平衡二叉树
2014-04-12 15:06
183 查看
平衡二叉树产生的原因
平衡二叉树源于二叉排序树,由二叉排序树的查找算法可知在数据的分布越分散或者说越均匀时,其算法的查找效率(时间复杂度)越好。这里可能不太好理解所谓的二叉排序树的分布情况,请看下图:图一中的二叉排序树的右字数都为空,则此形态下的查找算法的时间复杂度和线性表一致。而图二中的二叉排序树在形态上分布是均匀的则其查找算法的时间复杂度就要由于图一。为了保证二叉排序树不出现极端的情况,因此就提出了平衡二叉树的概念。
概念
平衡二叉树又称为***L数,它或者是一棵空树或者是具有如下性质的二叉树:它的左右子树都是平衡二叉树,且左、右子树的高度差的绝对值不超过1。所谓的高度差呢,就是深度差。直白的说就像商贩卖水果,多重的水果就用多重的秤砣。一定要保持平衡才可以,不管是买家还是买家都不愿意吃亏的。平衡二叉树旋转
平衡二叉树的插入操作,必定要破坏之前的平衡。秤好的一斤水果,不论你加水果还是加秤砣平衡一定要遭到破坏。那么为了保证其平衡,我们在插入操作后就需要对新的二叉树做一些处理,让二叉树恢复平衡,即旋转。旋转有四种形式,下面就先对应看看实例,之后予以说明。LL型(单向右旋)
RR型(单向左旋)
LR型(先右后左)
RL型(先左后右)
旋转的目的是为了恢复插入的新节点而破坏了的平衡。从图中大概应该能看出来具体的思路。单一旋转理解起来比较简单,就像找一段线段的中点,当线段在哪一边延长中点就会往哪边移动。由此可见,旋转的重点是找到被破坏的平衡点(线段中点),和破坏平衡的子树(线段延长方向)。
然后我们来看看符合型的旋转,以RL型实例为例,插入新节点28时,30这个节点的平衡遭到破坏,其左子树的节点深度为3而右子树深度为1。这时,我们进行单一右旋将中心移到20这个节点,平衡还是被破坏的。这时因为,此时新节点28离20的高度还是为3,也就是说单一右旋并没有改变新节点和中点的高度差。那么我们就需要先对其左旋使得新节点与中心点的高度差为2,然后在此右旋,大功告成了就。
相关文章推荐
- wget 参数解析篇
- 数据结构12:模式匹配BF算法
- 数据结构之二叉树
- [综合面试] 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
- 程序员面试宝典_第13章_数据结构基础_排序算法小结(3)
- 一步一步写算法(之通用数据结构)
- 数据结构与算法:七种排序算法总结(冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序、快速排序)
- 程序员面试宝典_第13章_数据结构基础_排序算法小结(2)
- 数据结构链表的简单操作
- Set、List、Map以及Arraylist、LikedList、Vector、Hashtable、HashMap的介绍
- win32汇编数据结构(二)
- 多线程的那点儿事(之多线程数据结构)
- 数据结构之栈
- Linux TCP/IP 协议栈的关键数据结构Socket Buffer(sk_buff )
- opencv 基本数据结构
- 软考之路(一)---数据结构
- 软考之路(一)---数据结构
- 数据结构11:汉诺塔问题
- ucOS学习笔记(3)——ucOS的数据结构
- 输入整数n,计算从1到n这n个整数的十进制表示中1出现的次数和