红黑树数据结构

什么是红黑树

        红黑树,Red-Black Tree ,是一个自平衡(不是绝对的平衡)的二叉查找树(BST)。是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。

有哪些特征

  • 性质1:每个节点要么是黑色,要么是红色。

  • 性质2:根节点是黑色。
  • 性质3:每个叶子节点(NIL)是黑色。

  • 性质4:每个红色结点的两个子结点一定都是黑色。如下,

2000的子节点不是黑色,不满足性质4,需要进行“自平衡”操作。得到如下

还不满足,根2000节点是红色,根据性质1,需要进行“变色”操作。就可以满足了。

性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。(保证这棵树尽量是平衡的。)

红黑树结点的叫法

我们把正在处理(遍历)的结点叫做当前结点,如图中的D,它的父亲叫做父结点,它的父亲的另外一个子结点叫做兄弟结点,父亲的父亲叫做祖父结点。

  • 红黑树的自平衡的处理可以总结为:自己能搞定的自消化; 自己不能搞定的叫兄弟帮忙; 兄弟都帮忙不了的,通过父母,找远方亲戚。

性能比较

  • 查找代价:由于红黑树的性质(最长路径长度不超过最短路径长度2倍),可以说明红黑树虽然不像AVL一样严格平衡,但平衡性能还要比BST要好。其查找代价基本维持在O(logN)左右,但在最差情况下(最长路径最短路径2倍少1),比AVL要略逊色一点。
  •  插入代价:RBT插入结点时,需要旋转操作和变色操作。但由于只需要保证RBT基本平衡就可以了。因此插入结点最多只需要2次旋转,这一点和AVL插入操作一样。虽然变色操作需要O(logN),但变色操作十分简单,代价很小。
  •  删除代价:RBT删除操作代价要比AVL要好多,删除一个结点最多只需要3次旋转操作。从根到叶子节点的最大路径不能大于最短路径的两倍长,大致上是平衡的,插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例。

        简而言之,红黑树就是在二叉树和AVL之间取一个权衡,既不要求完全不平衡(容易退化成链表,影响性能),也不像AVL一样严格平衡(自旋会造成很大的性能消耗,不划算)。这样可以在获得较好的操作性能。

        

Java 代码实现:

todo 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值