红黑树基础

什么是红黑树

红黑树是一种自平衡的二叉查找树。红黑树是一种很重要的数据结构,Java中TreeMap,TreeSet和jdk1.8中的HashMap底层都使用了红黑树。

红黑树的性质

红黑树有五个性质。
1. 节点为红色或者黑色
2. 根节点为黑色,新插入的节点为红色
3. 叶子节点为null并且为黑色
4. 红色节点的子节点都是黑色
5. 从任意一个节点到其每个叶子节点经过的黑色节点个数都是相等的。
有了以上的这五个性质,才实现了红黑树的自平衡,从根节点到叶子的最常路径不超过最短路径的两倍。

红黑树增加节点

红黑树增加和删除节点,首先需要查询到该节点的位置,然后增加或者删除。如果破坏了红黑树规则,则使用一些策略来保证规则。

红黑树变色和旋转

红黑树变色

红色变黑色,黑色变红色。

左旋转

以自己为基准,自己的右孩子P取代自己的位置,自己成为右孩子的左孩子,右孩子P的左孩子成为自己的右孩子。

右旋转

和左旋转相反,以自己为基准,自己的左孩子P取代自己的位置,自己成为左孩子的右孩子,左孩子P的右孩子成为自己的左孩子。

什么时候用变色,什么时候用旋转

红黑树的插入和删除比较复杂,包含很多种情况,每一种情况有不同的处理方式。

增加节点

红黑树新插入的节点都是红色的。首先按照二叉查找树的方式进行添加。增加节点有5种情况。

1

树为空,则直接插入变黑。

2

树的父节点为黑,直接插入,不变色

3

如果父节点P和叔父节点U二者都是红色,(此时新插入节点N做为P的左子节点或右子节点都属于情形3,这里右图仅显示N做为P左子的情形)则我们可以将它们两个重绘为黑色并重绘祖父节点G为红色(用来保持性质5)。现在我们的新节点N有了一个黑色的父节点P。此时G节点可能会与上层的树发生冲突,那么就将G视为新的节点进行递归。
image

4

父节点P是红色而叔父节点U是黑色或缺少,并且新节点N是其父节点P的右子节点而父节点P又是其父节点的左子节点。在这种情形下,我们进行一次左旋转调换新节点和其父节点的角色;接着,我们按情形5处理以前的父节点P以解决仍然失效的性质4
image

5

父节点P是红色而叔父节点U是黑色或缺少,新节点N是其父节点的左子节点,而父节点P又是其父节点G的左子节点。在这种情形下,我们进行针对祖父节点G的一次右旋转;在旋转产生的树中,以前的父节点P现在是新节点N和以前的祖父节点G的父节点。我们知道以前的祖父节点G是黑色,否则父节点P就不可能是红色(如果P和G都是红色就违反了性质4,所以G必须是黑色)。我们切换以前的父节点P和祖父节点G的颜色,结果的树满足性质4。
image

红黑树的时间复杂度

保证最坏情况O(logn),当红黑树出现不平衡的时候,保证在3次旋转内解决。

红黑树和Hash表的选择

总体来说,Hash表的速度比红黑树更快,而且查找速度和数据量的大小无关。如果数据量特别大的时候,建议使用哈希表,不过当内存要求比较严格的时候,推荐使用红黑树。

红黑树和AVL树的区别

红黑树以牺牲平衡性换取更少的旋转操作,提高插入和删除的效率。它是一种部分平衡的。而AVL树是严格平衡的。当删除节点导致不平衡的时候,会消耗更多的时间。但是AVL树的查询效率会比红黑树高一点点。如果查询较多,建议选择AVL树,如果增加和删除较多,建议使用红黑树。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值