其他分享
首页 > 其他分享> > 红黑树

红黑树

作者:互联网

从2-3-4树到红黑树:

红黑树其实就是对概念模型2-3树(或者2-3-4树)的一种实现

红黑规则:

  1. 节点不是红色就是黑色;
  2. 根节点是黑色;
  3. 红黑树的叶子节点并非传统的叶子节点,红黑树的叶子节点是null节点(空节点)且为黑色;
  4. 同一路径,不存在连续的红色节;
  5. 任意节点到叶子节点经过的黑色节点数目相同;

左旋:

 

 1 public void leftRotate(RedBlackTreeNode p) {
 2     // 在当前节点不为null时,才进行左旋操作
 3     if (p != null) {
 4         // 先记录p的右儿子
 5         RedBlackTreeNode rightChild = p.right;
 6 
 7         // 1. 空出右儿子的左子树
 8         p.right = rightChild.left;
 9         // 左子树不为空,需要更新父节点
10         if (rightChild.left != null) {
11             rightChild.left.parent = p;
12         }
13 
14         // 2. 空出节点p的父节点
15         rightChild.parent = p.parent;
16         // 父节点指向右儿子
17         if (p.parent == null) { // 右儿子成为新的根节点
18             this.root = rightChild;
19         } else if (p == p.parent.left) { // 右儿子成为父节点的左儿子
20             p.parent.left = rightChild;
21         } else { // 右儿子成为父节点的右儿子
22             p.parent.right = rightChild;
23         }
24 
25         // 3. 右儿子和节点p成功会师,节点p成为左子树
26         rightChild.left = p;
27         p.parent = rightChild;
28     }
29 }

 

右旋:

 1 public void rightRotate(RedBlackTreeNode p) {
 2     if (p != null) {
 3         // 记录p的左儿子
 4         RedBlackTreeNode leftChild = p.left;
 5 
 6         // 1. 空出左儿子的右子树
 7         p.left = leftChild.right;
 8         // 右子树不为空,需要更新父节点
 9         if (leftChild.right != null) {
10             leftChild.right.parent = p;
11         }
12 
13         // 2. 空出节点p的父节点
14         leftChild.parent = p.parent;
15         // 父节点指向左儿子
16         if (p.parent == null) { // 左儿子成为整棵树根节点
17             this.root = leftChild;
18         } else if (p.parent.left == p) { // 左儿子成为父节点左儿子
19             p.parent.left = leftChild;
20         } else { // 左儿子成为父节点的右儿子
21             p.parent.right = leftChild;
22         }
23 
24         // 3. 顺利会师
25         leftChild.right = p;
26         p.parent = leftChild;
27     }
28 }

红黑树新增节点:

删除节点:

总结:

标签:rightChild,parent,leftChild,红黑树,节点,left
来源: https://www.cnblogs.com/siu-miner/p/16221542.html