39public class RedBlackTree<Key
extends Comparable<Key>,Value>
40 extends BinarySearchTree<Key,Value> {
43 protected class RBNode extends BinarySearchTree<Key,Value>.Node {
44 RBNode(RedBlackTree<Key,Value> tree,Key key,Value value) {
45 super(tree,key,value);
53 public boolean isRed() {
return red_; }
57 return "["+getData().toString()+
"]";
60 return getData().toString();
64 return isRed() ?
"[red]" :
"[black]";
69 @Override
protected Node createNode(Key key,Value value) {
70 return new RBNode(
this,key,value);
74 public RedBlackTree() {
76 decorator_ =
new RedBlackDecorator();
80 private boolean isRed(RBNode node) {
81 return node!=
null ? node.isRed() :
false;
85 private boolean isRoot(RBNode node) {
86 assert(node!=
null && node!=
head_);
87 return node.getParent()==
head_;
90 @Override
protected void onInsert(Node _node) {
91 RBNode node=(RBNode) _node;
97 remedyDoubleRed(node);
100 protected void remedyDoubleRed(RBNode node) {
101 RBNode parent=(RBNode) node.getParent();
103 assert(parent!=
head_);
105 if (isRoot(parent) ||
109 RBNode grandparent=(RBNode) parent.getParent();
111 RBNode sibling=(RBNode) grandparent.getLeft();
113 sibling=(RBNode) grandparent.getRight();
115 if (!isRed(sibling)) {
116 RBNode b=(RBNode) restructure(node);
118 ((RBNode) b.getLeft()).red_=
true;
119 ((RBNode) b.getRight()).red_=
true;
125 assert(sibling!=
null) :
"red node must exist";
128 assert(grandparent!=
null && grandparent!=
head_);
129 if (!isRoot(grandparent)) {
130 grandparent.red_=
true;
131 remedyDoubleRed(grandparent);
139 protected void onRestructuring() {
142 protected void onRecoloring() {
146 @Override
protected void checkConsistency(Node node) {
147 super.checkConsistency(node);
149 RBNode anode=(RBNode) node;
152 RBNode left=(RBNode) anode.getLeft();
153 RBNode right=(RBNode) anode.getRight();
155 assert(left ==
null || !left .isRed());
156 assert(right==
null || !right.isRed());
158 if ((left !=
null && left .isRed()) ||
159 (right!=
null && right.isRed()))
160 throw new RuntimeException(
"double red node at '"+anode+
"'");
167 @Override
public Value
remove(Key key) {
168 throw new UnsupportedOperationException(
"RedBlackTree#remove");
173 @SuppressWarnings(
"unchecked")
175 String style=super.getNodeDecoration(
object);
176 if (style!=
null ||
object==
head_)
178 return ((
RBNode)
object).isRed() ?
179 "style=filled,fillcolor=lightcoral,penwidth=1" :
180 "style=filled,fillcolor=lightblue,penwidth=3";
185 public static void main(String[] args) {
188 RedBlackTree<Integer,Object> tree=
new RedBlackTree<Integer,Object> ();
190 System.out.println(tree);
193 int[] keys={4,7,12,15,3,5,14,18,16,17,};
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();
204 System.out.println(tree.toTikZ());
boolean isRed()
Is node red?
String getNodeDecoration(aud.util.GraphvizDecorable object)
Interface for decorating items of Graphvizable objects.
AuD lecture: Data structures, algorithms, examples.