红黑树初步理解

为什么?

为什么要学习红黑树?我们数据结构中学习过二叉查找树,二叉查找树可以增大查找的效率,但是二叉查找树有一个巨大的缺陷,那就是最坏的情况,二叉查找树会退化为链表(查找树不一定平衡);我们还学过二叉平衡树,就是说二叉树中任意节点的左右子树高度差不大于1,但是平衡二叉树也有一个缺陷,就是插入/删除的时候,可能频繁地进行旋转操作,降低了程序效率。为解决以上问题,红黑树应运而生。

是什么?

红黑树的定义是什么?维基百科给出了这样的定义:
同时满足以下5个条件的二叉树为红黑树:
(1)所有的节点为红色的,或者黑色的;
(2)根节点为黑色节点;
(3)所有的叶子节点不存储数据(为空节点),全部为黑色;
(4)如果一个节点为红色,则它的左右子节点必须为黑色;
(5)任意节点每个叶子节点的黑高(节点的黑高,也就是该节点到叶子节点经过的黑色点数)相同。

好在哪?

(1)维持了黑色节点的平衡性,且任意节点的左右子树深度差不会超过2,大体上也等于平衡二叉树的性能;
(2)相比平衡二叉树,大大减少了其旋转操作,减少了插入复杂程度。

  • 插入时:
    我们插入新的元素到红黑树中的时候,新的节点默认为红色。插入的元素位置一定是在叶子节点(空节点)的上一层(为什么?->回想二叉搜索树的插入过程)
    所以:
    (1)如果插入位置的父节点为黑色,则我们插入的红色节点不会破坏红黑树的规则,直接插入,不需要任何修改;
    (2)如果插入的位置父节点为红色,我们才会根据需要进行颜色改动或者旋转变换,但是过程也比较简单。(纯变色一种,旋转+变色4种)

  • 删除时:
    删除时稍显复杂,但是无论是那种类型的删除,我们第一步都是一样的:
    (1)找到删除节点的左子树的最大值(或者右子树的最小值),然后将找到的值替换删除节点的值,然后我们要删除的点转换成了那个最大(或最小值)了。(下面的解释中我们默认为找到右子树最小值替换)然后我们就研究怎样对那个叶子节点上一层的最小值进行删除就可以了

插入删除操作简述:

1.插入操作
(我们插入时默认插入的是红色节点,且插入时一定插入在叶子节点的父节点)
在这里我们将插入操作分为了6种情况:


1.PNG

2.删除操作
删除操作我们选取右子树的最小节点替换亟待删除的节点。(如果没有右子树,说明此节点是最大节点,直接删除,将其左子树代替它的位置即可)
因为替代的节点是右子树最小节点,则这个节点一定不存在左子树,我们将删除点分为以下几种情况:

2.PNG

3.PNG

待项目完成,再将红黑树的建立和操作代码传上来

你可能感兴趣的:(红黑树初步理解)