一、平衡二叉树
1.定义
为了避免树的高度增长过快,降低二叉排序树的性能,规定在插入和删除结点时,要保证任意结点的左、右子树的高度差的绝对值不超过1
2.插入
插入过程的前半部分与二叉排序树相同,但是在新结点插入后,若造成查找路径上的某个结点不平衡,则需要进行调整。
调整时的原则:只调整最小不平衡子树。
将调整的规律可以分为一下四种情形。
①LL型:最小不平衡子树中间结点向上进行一次右单旋
②RR型:最小不平衡子树中间结点向上进行一次左单旋
③LR型:最小不平衡子树第三层结点先向上左单旋,再向上进行右单单旋
④RL型:最小不平衡子树第三层结点先向上右单旋,再向上进行左单单旋
注意(易错):
双旋的时候,儿子结点如果如果还有子树,第一次旋转时,其中一个子树会交给父结点,成为父结点的子树。第二次旋转时,剩下的那一棵子树交给爷结点,成为爷结点的其中一课子树。
至于在旋转中,哪棵子树给爷,哪棵子树给父,需要考虑到二叉排序的特性。
eg:
3.删除
步骤:
①先找到待删除元素的位置,直接删除
②观察删除之后是否破坏了平衡二叉树的性质③若破坏了,找出最小不平衡子树,接着判型,进行调整。(易错)
4.查找
时间复杂度:O(logn)
二、红黑树
由于AVL树非常严格的平衡性,插入和删除的操作后,有可能会非常频繁地调整全树整体拓扑结构,代价较大。
所以再AVL树地平衡标准上进一步放宽条件,就引入了红黑树。
1.定义
①根叶黑:根结点、叶结点都是黑色地
②不红红:不存在两个相邻地红结点
③黑高同:对每个结点,从该结点到任意一个叶结点的简单路径上,所含黑结点的数量相同
④左根右:满足二叉排序树的性质
相关概念:
①黑高:从该结点出发(不含该结点)到达任一叶结点的路径上黑结点的数量
②叶结点:在红黑树中,“叶结点”通常指“失败结点”
性质:①从根节点到叶结点的最大路径不大于最短路径的2倍
由不红红和黑路同推出来,这一点就比平衡二叉树性能好,左右高度
2倍,而平衡二叉树要求左右高度
1
②有n个内部结点的红黑树高度
思考:根节点黑高为h的红黑树,内部节点数(关键字)至少有多少个?==>内部结点数最少的情况---总共
层黑结点的满树形态
结论:若根节点黑高为h,内部结点数(关键字)最少
个
证明性质②:若红黑树总高度=
,则根节点黑高
,因此内部结点数
===>
2.插入
插入步骤思想:
①先查找,确定插入位置(二叉排序树),插入新结点
②新结点是根---染为黑色
③新结点非根---染为红色若插入结点后依然满足红黑树定义,则插入结束
若插入结点后不满足红黑树定义,需要调整(看叔叔脸色行事),使其满足红黑树定义
黑叔: (旋转+染色) (这一步可以简单类比二叉树转换过程,翻转的元素要染色)
LL型:右单旋,然后染色(父换爷,父爷染色)
RR型:左单旋,然后染色
LR型:左右双旋,然后染色(儿换爷,儿爷染色)
RL型:右左双旋,然后染色
红叔: (染色+变新)
叔父爷染色,爷变为新结点。(爷变新后仍要检查爷这个结点是否满足红黑特性,这里用到递归,循环②③)
每次插入时,除了根节点以外,插入的结点都是红色的,所以在插入时,只需要检验有没有破坏不红红这一特性就行了,其他特性不用检验。
红黑树优点:随着树中插入结点的元素变多,需要调整的次数也就变少了
eg: