AVL、红黑树总结

AVL树

BST树在最差的情况下,和顺序查找效率相当,退化成了线性结构,因为BST树的左右子树高度差太大,如下
在这里插入图片描述
由此引出了AVL树,AVL树是带有平衡条件的BST,这个平衡条件必须容易保持,且需要保持树的深度O(logn),
(1)AVL树仍然是一颗二叉树,满足递归定义;
(2)其次又是一颗BST树,满足有序;
(3)每个节点左右子树高度差的绝对值不能超过1.

AVL 树效率分析
查找的时间复杂度维持在O(logN),不会出现最差情况
AVL树在执行每个插入操作时最多需要1次旋转,其时间复杂度在O(logN)左右。
AVL树在执行删除时代价稍大,执行每个删除操作的时间复杂度需要O(2logN)。

AVL树各节点的平衡因子定义为左子树深度减去右子树深度,平衡因子一般都只能-1,0,1,当绝对值大于1时AVL就失去平衡。
在完成插入后,失衡只有那些从插入点到根节点路径上的平衡可能被打破,当沿着这条路径上溯到根,找到插入新节点后失去平衡的最小子树根节点的指针x,然后再调整这个子树使之重新平衡。当失去平衡的最小子树调整平衡后,原有的其他所有不平衡树无需调整,整个二叉树回归平衡(就是插入一个节点后,不会有集连调整,因为以调整的节点的为根节点的树的高度降低了,上面的节点不会再出现大于1的情况)

几种旋转的情况:
(1)插入点位于x的左孩子的左子树中 --左左LL
在这里插入图片描述
(2)插入点位于x的左孩子的右子树中 --左右LR
在这里插入图片描述
(3)插入点位于x的右孩子的左子树中 --右左RL
在这里插入图片描述
(4)插入点位于x的右孩子的右子树中 --右右RR
在这里插入图片描述

红黑树
对红黑树的操作在最坏情况下花费O(log n)时间,而且相对于普通AVL树可能更容易实现。相比较AVL,
1 AVL是严格平衡树,故在增加或者删除节点时,调整所需旋转较多;
2 RBT是弱平衡,用非严格的平衡换取增删节点时操作的简单。
当操作主要集中在搜索而非增删时应采用AVL;如果增删操作更多,为了提高可操作性应该选择RBT。
定义:
(1) 首先是BST,故中序遍历后是非递减序列;
(2) 弱化的平衡树;
(3) 不同于BST,AVL,RBT每个节点含有五个域,color/key/left/right/p;
(4) 根节点一定是黑的,全空的这种叶子节点也是黑的,其他每个节点非黑即红(特性1);
(5) 如果叶子节点是红的,那么两个孩子肯定都是黑的
(6) 对于每一个节点,从该节点到NULL节点的所有路径上包含相同数目的黑节点
RBT确保没有一条路径会比其他路径长出2倍,因而是一种广泛意义上的平衡。同其他BST一样,问题在于一个新节点的插入,通常做法是将其放在叶子上。如果把它改成黑色,那么肯定违反路径同数目黑色的原则,因此肯定要标为红色:如果它的父节点是黑色,那么插入完成;如果父节点是红色,那么违反父红子黑原则,故需要调整。主要是颜色的改变和旋转。

哨兵结点:颜色一定是黑色的,让所有的空结点全部指向哨兵结点,为了节省空间,由开辟n多个变成开辟1个,无邵兵节点,编程压力大。

红黑树的插入:
1、新节点一定时红色
2、当新节点的父节点为黑色时不需要旋转
3、当新节点的父节点为红色时,判断叔父节点
(1)叔父节点为红色,改变叔父节点和父节点的颜色
(2)叔父节点为黑色时,旋转。
两种调整:(不管怎么调整,根节点一定是黑色的)
1、叔父节点为黑色(叔父节点:34的兄弟 节点,为空,所以是黑色)
在这里插入图片描述
2、叔父节点为红色(叔父节点:34的兄弟节点,为空,所以是黑色)
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值