红黑树的插入

往红黑树中插入一个新的节点的过程比较简单。因为红黑树本身是二叉搜索树,所以,只需要从根节点开始,逐步比较大小,即可把待插入的节点放置在合适的位置上。

新节点放在合适的位置上之后,关键是后面为了维持红黑树的性质而进行的动作。

首先要解决一个问题,新插入的节点默认设置为红色还是黑色呢?

从红黑树的性质我们知道,红黑树的左右子树具有相等的黑高。如果新插入的节点默认设置为黑色,则势必会破坏左右子树的黑高相等的特点。此时,再调整红黑树,就会比较繁琐。而如果默认将新插入的节点设置为红色,它不会破坏相等黑高的已有状态,我们只需要解决红节点的左右孩子必须是黑节点的问题即可。所以,红黑树新插入的节点,默认设置为红色。

插入一个红色的节点,它的位置有5中情况。

1,新插入的节点位于树根节点。

2,新插入的节点的父亲是黑节点。

3,新插入的节点的父亲是红节点,爷爷是黑节点(爷爷是黑节点是肯定的,因为红黑树在插入新节点之前,它已经是一个红黑树了。红黑树的性质决定了红节点的父亲必定是黑节点),叔叔是红节点。

4,新插入的节点的父亲是红节点,爷爷是黑节点,叔叔是黑节点。新插入的节点是父亲的右孩子。

5,新插入的节点的父亲是红节点,爷爷是黑节点,叔叔是黑节点,新插入的节点是父亲的左孩子。

上述5种情况涵盖了插入的新节点所有可能出现的位置。所以,只要我们依次解决了上述5种情况发生后,红黑树应该做什么调整,那么,红黑树插入新节点的问题就会得到解决。下面分别对5中情况进行说明。

1,这种情况是插入前红黑树为空,新插入的节点为红黑树的第一个节点。这种情况下,直接把新插入的红节点,设置为黑色即可。

2,因为新插入的红节点的父亲是黑节点,所以这个新节点的插入,并没有破坏之前红黑树的性质。所以,这种情况下,无需做任何调整,程序直接结束即可。

3,这种情况下,新插入的红节点和他的红色的父亲直接,破坏了红黑树的“红节点的孩子必须是黑节点”的性质。这种情况的处理方式是把父节点设置为黑色,爷爷节点设置为红色,叔叔节点设置为黑色,即可保持新插入节点的附近的树枝的红黑树性质。而爷爷节点被设置为红色后,因为爷爷节点的父节点有可能为红节点,所以还需要继续往上调整。爷爷节点被设置红色后,可以转到情况2,3,4,5。

4,这种情况,左旋新插入的节点和它的父节点,即可转到情况5.

5,这种情况,把父节点设置为黑色,爷爷节点设置为红色。然后右旋父节点和爷爷节点。

你可能感兴趣的:(数据结构)