AuD
Lecture 'Algorithmen und Datenstrukturen' (code examples)
RedBlackTree.java
Go to the documentation of this file.
1package aud;
2
39public class RedBlackTree<Key extends Comparable<Key>,Value>
40 extends BinarySearchTree<Key,Value> {
41
43 protected class RBNode extends BinarySearchTree<Key,Value>.Node {
44 RBNode(RedBlackTree<Key,Value> tree,Key key,Value value) {
45 super(tree,key,value);
46 tree_=tree;
47 red_=true; // insert red node
48 }
49
50 boolean red_;
51
53 public boolean isRed() { return red_; }
54
55 @Override protected String textLabel() {
56 if (red_)
57 return "["+getData().toString()+"]";
58 // return "\033[91m"+getData().toString()+"\033[0m";
59 else
60 return getData().toString();
61 }
62
63 @Override protected String tikzNodeStyle() {
64 return isRed() ? "[red]" : "[black]";
65 }
66 }
67
69 @Override protected Node createNode(Key key,Value value) {
70 return new RBNode(this,key,value);
71 }
72
74 public RedBlackTree() {
75 super();
76 decorator_ = new RedBlackDecorator();
77 }
78
80 private boolean isRed(RBNode node) {
81 return node!=null ? node.isRed() : false;
82 }
83
85 private boolean isRoot(RBNode node) {
86 assert(node!=null && node!=head_);
87 return node.getParent()==head_;
88 }
89
90 @Override protected void onInsert(Node _node) {
91 RBNode node=(RBNode) _node;
92 node.red_=true;
93
94 if (isRoot(node))
95 node.red_=false;
96 else
97 remedyDoubleRed(node);
98 }
99
100 protected void remedyDoubleRed(RBNode node) {
101 RBNode parent=(RBNode) node.getParent();
102
103 assert(parent!=head_); // !isRoot(node)
104
105 if (isRoot(parent) || // root is black!
106 !parent.isRed())
107 return;
108
109 RBNode grandparent=(RBNode) parent.getParent();
110
111 RBNode sibling=(RBNode) grandparent.getLeft();
112 if (sibling==parent)
113 sibling=(RBNode) grandparent.getRight();
114
115 if (!isRed(sibling)) { // restructuring
116 RBNode b=(RBNode) restructure(node);
117 b.red_=false;
118 ((RBNode) b.getLeft()).red_=true;
119 ((RBNode) b.getRight()).red_=true;
120
121 onRestructuring();
122 }
123 else { // recoloring
124 parent.red_=false;
125 assert(sibling!=null) : "red node must exist";
126 sibling.red_=false;
127
128 assert(grandparent!=null && grandparent!=head_);
129 if (!isRoot(grandparent)) {
130 grandparent.red_=true;
131 remedyDoubleRed(grandparent);
132
133 onRecoloring();
134 }
135 }
136 }
137
139 protected void onRestructuring() {
140 }
142 protected void onRecoloring() {
143 }
144
146 @Override protected void checkConsistency(Node node) {
147 super.checkConsistency(node);
148
149 RBNode anode=(RBNode) node;
150
151 if (anode.isRed()) {
152 RBNode left=(RBNode) anode.getLeft();
153 RBNode right=(RBNode) anode.getRight();
154
155 assert(left ==null || !left .isRed());
156 assert(right==null || !right.isRed());
157
158 if ((left !=null && left .isRed()) ||
159 (right!=null && right.isRed()))
160 throw new RuntimeException("double red node at '"+anode+"'");
161 }
162 }
163
167 @Override public Value remove(Key key) {
168 throw new UnsupportedOperationException("RedBlackTree#remove");
169 }
170
171 public class RedBlackDecorator extends Decorator {
172 @Override
173 @SuppressWarnings("unchecked")
174 public String getNodeDecoration(aud.util.GraphvizDecorable object) {
175 String style=super.getNodeDecoration(object);
176 if (style!=null || object==head_)
177 return style;
178 return ((RBNode) object).isRed() ?
179 "style=filled,fillcolor=lightcoral,penwidth=1" :
180 "style=filled,fillcolor=lightblue,penwidth=3";
181 }
182 }
183
185 public static void main(String[] args) {
186
187 //RedBlackTree<String,Object> tree=new RedBlackTree<String,Object> ();
188 RedBlackTree<Integer,Object> tree=new RedBlackTree<Integer,Object> ();
189
190 System.out.println(tree);
191
192 //String[] keys={"a","b","c","d","e","f","g"};
193 int[] keys={4,7,12,15,3,5,14,18,16,17,};
194
195 //for (String key : keys) {
196 for (int key : keys) {
197 System.out.println("insert '"+key+"'");
198 tree.insert(key,null);
199 System.out.println(tree);
200 System.out.println(tree.toText());
201 tree.checkConsistency();
202 }
203
204 System.out.println(tree.toTikZ());
205 }
206}
Node head_
node in a RedBlackTree
boolean isRed()
Is node red?
String getNodeDecoration(aud.util.GraphvizDecorable object)
Interface for decorating items of Graphvizable objects.
AuD lecture: Data structures, algorithms, examples.
Definition: A234Tree.java:1