纯属个人笔记,来自《Java数据结构和算法》

 

 

二叉搜索树

满足l.data<data<r.data

 

 

 

平衡树

满足|rh - lh|<=1

 

 

 

RBTree 

一、满足一下规则就是平衡树

1.每个节点红色或黑色

2.根总是黑色

3.如果节点时红色的,则它的子节点必须是黑色的

4.从跟到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点

(黑色深度需要相同)

 

重复的关键字要分配到关键字的两侧

 

 

二、修正违规的情况:

1.改变节点颜色

一般为改变根节点

 

 

2.执行旋转操作

RoR,右旋转:执行一次旋转,所有的节点都将改变位置,旋转节点的左子节点会成为他的父节点,他将成为右子节点,他的右子节点仍然是他的右子节点

 

RoL,左旋转:执行一次旋转,所有的节点都将改变位置,旋转节点的右子节点会成为他的父节点,他将成为左子节点,他的左子节点仍然是他的左子节点

 

旋转中的特殊情况-节点平移,指的是旋转节点要成为子节点的子节点,但是当子节点已经有了子节点,那么右旋,会平移到右子节点,反之亦然。

 

旋转时可以平移子树

 

 

三、插入节点

概念:G->P->X

      外侧子孙,p和x都是左子节点或右子节点

      内侧子孙,反之,p和x的左右位置不同

      

在节点下行途中的颜色变换

每当查找例程遇到一个有两个红色子节点的黑色节点时,则必须把子节点变为黑色,父节点变为红色

--会引起问题3,因为子根变为了红色

 

插入后的旋转

插入后有三种情况

1.P是黑色的

2.P是红色的,X是G的一个外侧子孙节点

3.P是红色的,X是G的一个内侧子孙节点

当是1时,不用做任何处理

当是2时,需要一次旋转和一些颜色变换

                改变G和P的颜色,G进行旋转,将X向上升的方向(一般P是什么子,就反着转,如是左子,             就右旋)

当是3时,需要两次旋转和一些颜色变换

                改变G和P的颜色,先P旋转,P是什么子,就怎么选(如是左子,就左旋),这样可以讲节点变为外侧子孙节点;接着跟情况2相同,G进行旋转,将X向上升的方向

 

在节点下行途中的旋转

(在所有的颜色变换情况,当子根变为了红色,都会导致问题3)

同样也有两种情况,子跟变换之后成为1.外侧子孙节点 2.内侧子孙节点

这是X节点为违背节点,操作和插入时的2,3情况操作相同

 

 

四、删除节点

可以如同普通二叉树那样,用中续后的节点代替;

或是不删除节点,只是忽略这个节点