红黑树和AVL树

本文探讨了红黑树和AVL树这两种自平衡二叉查找树。AVL树是高度平衡的,任何节点的两个子树高度差不超过1。红黑树则通过特定的颜色规则保持平衡,确保在最坏情况下操作的时间复杂度为O(log n)。文章详细阐述了两种树的插入和删除节点的操作,并分析了它们在平衡调整上的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

红黑树与AVL树

红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。
AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。

特点:

AVL树:
性质1.本身首先是一棵二叉搜索树。
性质2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。
也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)。
在这里插入图片描述

红黑树:
性质1. 节点是红色或黑色。
性质2. 根节点是黑色。
性质3.所有叶子都是黑色。(叶子是NUIL节点)
性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5… 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
在这里插入图片描述

插入和删除节点:

红黑树:
1.节点插入算法
插入过程首先是根据一般二叉查找树的插入步骤, 把新节点 z 插入到 某个叶节点的位置上,然后将 z 着 为红色。 为了保证红黑树的性质能继续保 持,再对有关节点重点着色并旋转,其插入算法如下:
RB-INSERT (T,z)
{
1 按二叉查找树的插入步骤将节点 z 插入到 T 中;
2 color[z]=RED;
3 while(z 不是根节点 &&color[z->parent]= =RED) {Insert-Fixup(T,z);}
4 color[root[T]]=BLACK;
}
对上述算法分析,如果新插入的是黑色节点,那么它所在的路径上就多出一个黑色的节点,所以新插入的节点一定要设成红 色。 但是如果 z 的父节点也是红色,这就违反了每个红色节点的两个子节点都黑色的性质。
2.节点删除算法
与红黑树的的插入算法一样,对一个节点的删除算法要花 O(log n)时间,只是删 除算法略微复杂些,删除算法如下:
RB-DELETE(T,z)
{
1 if (z 的左右子节点均为 NIL)
2 { NIL 节点代替 z 的位置; delete(z); }
3 else if (z 有一个子节点为 NIL)
4 {z 的非 NIL 子节点代替 z 的位置;delete(z); }
5 else
6 {将红黑树中序遍历中 z 的后继节点 s 的值赋给 z; delete(s); }
7 if (删除的节点是黑色的) Delete-Fixup(T,x); /*x 指向代替删除节点的节点 */
}
AVL树:
1.节点插入在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.节点删除
(1)删除节点没有左子树,这种情况直接将删除节点的父节点指向删除节点的右子树。

(2)删除节点没有右子树,这种情况直接将删除节点的父节点指向删除节点的左子树。

(3)删除节点左右子树都存在,可以采用两种方式,

     1:让删除节点左子树的最右侧节点代替当前节点

     2:让删除节点右子树的最左侧节点代替当前节点

例如s在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值