概述
在阅读红黑树新增节点的源码时,思考了这样一个问题:inser一个节点之后,什么情况下需要旋转红黑树,什么情况下又不需要旋转红黑树呢?
引用:http://www.cnblogs.com/skywang12345/p/3245399.html
根据被插入节点的父节点的情况,可以将"当节点z被着色为红色节点,并插入二叉树"划分为三种情况来处理。
① 情况说明:被插入的节点是根节点。
处理方法:直接把此节点涂为黑色。
② 情况说明:被插入的节点的父节点是黑色。
处理方法:什么也不需要做。节点被插入后,仍然是红黑树。
③ 情况说明:被插入的节点的父节点是红色。
处理方法:那么,该情况与红黑树的“特性(5)”相冲突。这种情况下,被插入节点是一定存在非空祖父节点的;进一步的讲,被插入节点也一定存在叔叔节点(即使叔叔节点为空,我们也视之为存在,空节点本身就是黑色节点)。理解这点之后,我们依据"叔叔节点的情况",将这种情况进一步划分为3种情况(Case)。
现象说明 | 处理策略 | |
Case 1 |
当前节点的父节点是红色,且当前节点的祖父节点的另一个子节点(叔叔节点)也是红色。 可以看出,叔叔节点是红色时,暂时不需要旋转,需要刷新颜色之后再看 |
(01) 将“父节点”设为黑色。 |
Case 2 | 当前节点的父节点是红色,叔叔节点是黑色,且当前节点是其父节点的右孩子 |
(01) 将“父节点”作为“新的当前节点”。 |
Case 3 | 当前节点的父节点是红色,叔叔节点是黑色,且当前节点是其父节点的左孩子 |
(01) 将“父节点”设为“黑色”。 |
上面三种情况(Case)处理问题的核心思路都是:将红色的节点移到根节点;然后,将根节点设为黑色。下面对它们详细进行介绍。
二叉搜索树
给红黑树新增节点的第一步操作,就是按照二叉搜索树的性质,将节点插入树结构中。
先回顾一下二叉搜索树的概念。
二叉查找树(Binary Search Tree、二叉搜索树,二叉排序树):它或者是一棵空树,或者是具有下列性质的二叉树:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
它的左、右子树也分别为二叉排序树。
平衡二叉树
平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法)。
且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。