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)