少玩游戏多种树——红黑树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013700358/article/details/86729498

写在前面:

1. 关于红黑树,其实工作中并不会让你去构造以及实现如何增删节点,因为无论是C++还是Java,都封装了相应的数据结构(如map、set等),内部用的就是红黑树,但我们需要知道这有什么优点,解决了什么问题,以及在什么情况下用该数据结构,提高效率
2. 红黑树也是平衡二叉树的一种,相比AVL树,红黑树的规则更宽松,AVL树严格要求平衡因子之差小于2,因此在查找频繁时,AVL树更优,而在增删改频繁时,红黑树更优。

先看一下红黑树的介绍:
红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。除了二叉查找树的一些特性,还需满足如下要求:

  1. 节点是红色或黑色。
  2. 根是黑色。
  3. 所有叶子都是黑色。
  4. 每个红色节点必须有两个黑色的子节点(即从每个叶子到根的所有路径上不能有两个连续的红色节点)。
  5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

因此,通常来说,红黑树的数据结构除了需要有左右子树以及自身value外,还有一个指向父节点的指针
而相比AVL树,红黑树在增删改时,需要考虑的情形也比较多。
首先,在插入一个新节点时,预先将其标记为红色(相比标记为黑色,若连续出现两个红色,将更容易通过颜色变换以及树的旋转达到平衡)
而在删除时,则需要考虑,该节点有几个子树,若有两个子树,则需将右子树中的最小值或左子树中的最大值放入被删除的节点上,并删除那个被复制的节点,因此问题又可以转化为,删除最多一个子树的节点
两种操作的具体阐述与代码展示可见红黑树解析与代码(Wiki)教你透彻了解红黑树
同时,树的可视化展示可以看到上面提到的AVL树与红黑树的可视化展示,能够辅助理解
后续将补充并上传个人写的相关代码。

猜你喜欢

转载自blog.csdn.net/u013700358/article/details/86729498
今日推荐