1.新建一个RETree类extands BST,像AVL树一样先新建一个红黑树的节点,创建相应变量,RED,BLACK

  2.辅助函数,afteradd,afterremove,封装到染色函数以及一下一些基本函数

  private Node<E> color(Node<E> node,boolean color){
 2         if(node==null) return node;
 3        ((RBnode<E>)node).color=color;
 4        return node;
 5    }
 6    //染色
 7    private Node<E> RED(Node<E> node){
 8         return color(node,RED);
 9    }
10     private Node<E> BLACK(Node<E> node){
11         return color(node,BLACK);
12     }
13     private boolean colorof(Node<E> node){
14         return node ==null?BLACK: ((RBnode<E>)node).color;
15     }
16     private boolean isBlack(Node<E> node){
17         return colorof(node)==BLACK;
18     }
19     private boolean isRed(Node<E> node){
20         return colorof(node)==RED;
21     }
    3.node里新增兄弟,叔父节点,这个在BinaryTree里的node增加
 1 public Node<E> sibling() { // 红黑树中用到, 返回兄弟节点
 2             if (isLeftChild()) {
 3                 return parent.right;
 4             }
 5 
 6             if (isRightChild()) {
 7                 return parent.left;
 8             }
 9             return null;
10         }

4.添加

四种节点情况(12中添加情况)

其中加进去的父节点是黑色的情况,满足红黑树性质,不用修复(四种情况46,76,88中添加)

有八种不满足的情况,都要修复。

 

1.先修复这两个(LL,RR)

 

 思路:50变黑,46变红,52变黑,但是38和46有两个红色,

改变:38指向50,让50成为46和52的父节点(相当于让46左旋转,RR的情况)

76是LL的情况,同样的右旋转

2.再修复两个(LR,RL)

 

 

 3.剩下左边四种情况(叔父节点是红色,比如10的叔父节点是33,52的叔父节点是NULL)

 

 

 

 

 

 

 

 

 

 

 

所以:总共的情况为

1.四种满足

2.8中不满足(其中四种叔父节点为RED,四种不为红,每种都包括LL\RR\LR\RL)

 

 

 

 

 

 

 

 

 

 

 

 

 posted on 2021-09-29 13:12  “樂·~  阅读(62)  评论(0)    收藏  举报