@@ -44,14 +44,11 @@ public Node getRight() {
44
44
45
45
@ Override
46
46
public String getText () {
47
- // return String.valueOf(value) + "("+(color==RED?"r":"b")+","+(parent==null?null:parent.value)+")";
48
- return String .valueOf (value ) +
49
- " " + (color ==RED ?"r" :"b" )
50
- + " ("
51
- +(left ==null ?"N" :left .value )+","
52
- +(right ==null ?"N" :right .value )+","
53
- +(parent ==null ?"N" :parent .value )
54
- +")" ;
47
+ return String .valueOf (value ) + (color == RED ? " r" : " b" ) + " ("
48
+ + (left == null ? "N" : left .value ) + ","
49
+ + (right == null ? "N" : right .value ) + ","
50
+ + (parent == null ? "N" : parent .value )
51
+ + ")" ;
55
52
}
56
53
57
54
@ Override
@@ -61,7 +58,7 @@ public String toString() {
61
58
62
59
}
63
60
64
- // The root node of the AVL tree.
61
+ // The root node of the RB tree.
65
62
Node root ;
66
63
67
64
// Tracks the number of nodes inside the tree.
@@ -96,20 +93,24 @@ public boolean contains(T value) {
96
93
// Recursive contains helper method.
97
94
private boolean contains (Node node , T value ) {
98
95
99
- if (node == null ) return false ;
96
+ if (node == null || value == null ) return false ;
100
97
101
- // Compare current value to the value in the node.
102
- int cmp = value .compareTo (node .value );
98
+ while (node != null ) {
103
99
104
- // Dig into left subtree.
105
- if (cmp < 0 ) return contains (node .left , value );
100
+ // Compare current value to the value in the node.
101
+ int cmp = value .compareTo (node .value );
102
+
103
+ // Dig into left subtree.
104
+ if (cmp < 0 ) node = node .left ;
106
105
107
- // Dig into right subtree.
108
- if (cmp > 0 ) return contains ( node .right , value ) ;
106
+ // Dig into right subtree.
107
+ else if (cmp > 0 ) node = node .right ;
109
108
110
- // Found value in tree.
111
- return true ;
109
+ // Found value in tree.
110
+ else return true ;
111
+ }
112
112
113
+ return false ;
113
114
}
114
115
115
116
public boolean insert (T value ) {
@@ -165,6 +166,7 @@ private void insertionRelabel(Node node) {
165
166
root = node ;
166
167
return ;
167
168
}
169
+
168
170
Node grandParent = parent .parent ;
169
171
170
172
// Tree has a height of one, in which case the root is black
@@ -180,7 +182,6 @@ private void insertionRelabel(Node node) {
180
182
boolean parentIsRightChild = !parentIsLeftChild ;
181
183
182
184
Node uncle = parentIsLeftChild ? grandParent .right : grandParent .left ;
183
-
184
185
boolean uncleIsRedNode = (uncle == null ) ? BLACK : uncle .color ;
185
186
186
187
if (uncleIsRedNode ) {
@@ -340,55 +341,15 @@ public void remove() {
340
341
};
341
342
}
342
343
343
- // Make sure all left child nodes are smaller in value than their parent and
344
- // make sure all right child nodes are greater in value than their parent.
345
- // (Used only for testing)
346
- boolean validateBinarySearchTreeInvariant (Node node ) {
347
- if (node == null ) return true ;
348
- T val = node .value ;
349
- boolean isValid = true ;
350
- if (node .left != null ) isValid = isValid && node .left .value .compareTo (val ) < 0 ;
351
- if (node .right != null ) isValid = isValid && node .right .value .compareTo (val ) > 0 ;
352
- return isValid && validateBinarySearchTreeInvariant (node .left ) && validateBinarySearchTreeInvariant (node .right );
353
- }
354
-
355
- // Used for testing.
356
- boolean validateParentLinksAreCorrect (Node node , Node parent ) {
357
- if (node == null ) return true ;
358
- if (node .parent != parent ) return false ;
359
- return validateParentLinksAreCorrect (node .left , node ) && validateParentLinksAreCorrect (node .right , node );
360
- }
361
-
362
344
public static void main (String [] args ) {
363
345
364
- // int[] values = {88, 94, 99, 32, 3, 48, 93, 62, 85};
365
- // RedBlackTree<Integer> rbTree = new RedBlackTree<>();
366
- // for (int v : values) {
367
- // System.out.println("======================================================================================================================================================================================");
368
- // System.out.println("INSERTING: " + v);
369
- // rbTree.insert(v);
370
- // System.out.println("PARENT LINK STATUS: " + rbTree.validateParentLinksAreCorrect(rbTree.root, null));
371
- // rbTree.display();
372
- // }
373
-
374
- outer :
375
- for (int loop = 0 ; loop < 1000000 ; loop ++) {
376
- RedBlackTree <Integer > rbTree = new RedBlackTree <>();
377
- List <Integer > ar = new ArrayList <>();
378
- for (int i = 0 ; i < 9 ; i ++) ar .add ((int )(Math .random () * 100 ));
379
- for (int j = 0 ; j < ar .size (); j ++) {
380
- rbTree .insert (ar .get (j ));
381
- boolean inv = rbTree .validateBinarySearchTreeInvariant (rbTree .root );
382
- if (!inv ) {
383
- System .out .println ("BROKE AT INDEX: " + j );
384
- System .out .println (ar );
385
- rbTree .display ();
386
- break outer ;
387
- }
388
- }
346
+ int [] values = {88 , 94 , 99 , 32 , 3 , 48 , 93 , 62 , 85 };
347
+ RedBlackTree <Integer > rbTree = new RedBlackTree <>();
348
+ for (int v : values ) {
349
+ rbTree .insert (v );
350
+ rbTree .display ();
389
351
}
390
352
391
-
392
353
}
393
354
394
355
}
0 commit comments