Skip to content

Commit bbca939

Browse files
committed
[Function add]
1.Finish put method in red black tree.
1 parent 9e4ed76 commit bbca939

File tree

2 files changed

+60
-6
lines changed

2 files changed

+60
-6
lines changed

Algorithm(4th_Edition)/algorithm_note.txt

+43-5
Original file line numberDiff line numberDiff line change
@@ -1090,7 +1090,7 @@
10901090
->没有任何一个结点同时和两条红链接相连。
10911091
->该树是完美黑色平衡的,即任意空链接到根结点的路径上的黑链接数量相同。
10921092
实现:ca.mcmaster.chapter.three.rbtree.RedBlackBST<K, V>
1093-
public class RedBlackBST<K, V> {
1093+
public class RedBlackBST<K extends Comparable<K>, V> {
10941094
private Node root;
10951095
public static final Boolean RED = true;
10961096
public static final Boolean BLACK = false;
@@ -1113,8 +1113,8 @@
11131113
return node.color == RED;
11141114
}
11151115

1116-
public Node rotateLeft(Node node){ //将右侧的红链接与左链接(黑链接)交换
1117-
Node temp = node.right; //思考:如果将原父结点作为temp需要4条赋值语句,所以通过将右结点作为中间变量可以减少开销。
1116+
public Node rotateLeft(Node node){
1117+
Node temp = node.right;
11181118
node.right = temp.left;
11191119
temp.left = node;
11201120
temp.color = node.color;
@@ -1123,8 +1123,8 @@
11231123
node.N = 1 + size(node.left) + size(node.right);
11241124
return temp;
11251125
}
1126-
public Node rotateRight(Node node){ //将左侧的红链接与右链接(黑链接)交换
1127-
Node temp = node.left;
1126+
public Node rotateRight(Node node){
1127+
Node temp = node.left;
11281128
node.left = temp.right;
11291129
temp.right = node;
11301130
temp.color = node.color;
@@ -1137,12 +1137,50 @@
11371137
if(null == node) return 0;
11381138
return node.N;
11391139
}
1140+
public void filpColor(Node node){
1141+
node.color = RED;
1142+
node.left.color = BLACK;
1143+
node.right.color = BLACK;
1144+
}
1145+
public void put(K k, V v){
1146+
root = put(root, k, v);
1147+
root.color = BLACK;
1148+
}
1149+
public Node put(Node node, K k, V v){
1150+
if(node == null){ return new Node(k, v, 1, RED) ; }
1151+
int cmp = k.compareTo(node.k);
1152+
if(cmp < 0) return put(node.left, k, v);
1153+
else if(cmp > 0) return put(node.right, k, v);
1154+
else node.v = v;
1155+
if(isRed(node.right) && !isRed(node.left)) node = rotateLeft(node);
1156+
if(isRed(node.left) && isRed(node.left.left)) node = rotateRight(node);
1157+
if(isRed(node.left) && isRed(node.left.left)) filpColor(node);
1158+
node.N = size(node.left) + size(node.right) + 1;
1159+
return node;
1160+
}
11401161
}
11411162

11421163
4.颜色转换:
11431164
->两个子链接都是红链接,那么我们可以将父结点向上的链接变成红链接,将两个子链接变成黑链接。
11441165
实现:ca.mcmaster.chapter.three.rbtree.RedBlackBST#filpColor(Node)
11451166
->根节点总是黑色的,根据上一条,我们总是会将根节点设置为红链接,但是我们要将父结点设置成黑链接,每次由红色变成黑色树的黑链接高度增加1.
1167+
1168+
5.将红链接在树中向上传递:
1169+
->如果右结点是红色而左子结点是黑色,进行左旋转。
1170+
->如果左子结点是红色而且他的左子结点也是红色的,进行右旋转。
1171+
->如果左右子结点均是红色,颜色转换。
1172+
public Node put(Node node, K k, V v){
1173+
if(node == null){ return new Node(k, v, 1, RED) ; }
1174+
int cmp = k.compareTo(node.k); //对键向左右子结点进行比较,向左向右递归调用,直到找到了合适的结点。
1175+
if(cmp < 0) return put(node.left, k, v);
1176+
else if(cmp > 0) return put(node.right, k, v);
1177+
else node.v = v;
1178+
if(isRed(node.right) && !isRed(node.left)) node = rotateLeft(node); //如果右结点是红色而左子结点是黑色,进行左旋转。
1179+
if(isRed(node.left) && isRed(node.left.left)) node = rotateRight(node); //如果左子结点是红色而且他的左子结点也是红色的,进行右旋转。
1180+
if(isRed(node.left) && isRed(node.left.left)) filpColor(node); //如果左右子结点均是红色,颜色转换。
1181+
node.N = size(node.left) + size(node.right) + 1;
1182+
return node;
1183+
}
11461184

11471185

11481186

Algorithm(4th_Edition)/src/ca/mcmaster/chapter/three/rbtree/RedBlackBST.java

+17-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package ca.mcmaster.chapter.three.rbtree;
22

3-
public class RedBlackBST<K, V> {
3+
public class RedBlackBST<K extends Comparable<K>, V> {
44
private Node root;
55
public static final Boolean RED = true;
66
public static final Boolean BLACK = false;
@@ -52,4 +52,20 @@ public void filpColor(Node node){
5252
node.left.color = BLACK;
5353
node.right.color = BLACK;
5454
}
55+
public void put(K k, V v){
56+
root = put(root, k, v);
57+
root.color = BLACK;
58+
}
59+
public Node put(Node node, K k, V v){
60+
if(node == null){ return new Node(k, v, 1, RED) ; }
61+
int cmp = k.compareTo(node.k);
62+
if(cmp < 0) return put(node.left, k, v);
63+
else if(cmp > 0) return put(node.right, k, v);
64+
else node.v = v;
65+
if(isRed(node.right) && !isRed(node.left)) node = rotateLeft(node);
66+
if(isRed(node.left) && isRed(node.left.left)) node = rotateRight(node);
67+
if(isRed(node.left) && isRed(node.left.left)) filpColor(node);
68+
node.N = size(node.left) + size(node.right) + 1;
69+
return node;
70+
}
5571
}

0 commit comments

Comments
 (0)