红黑树有5个性质,此处不赘述,直接是代码的实现:
其中前序和后序输出没有给出,把中序输出改一下即是
public class RedBlackTree extends BinarySearchTree { public RedBlackTree() { NIL.setColor(Color.BLACK); this.setRoot(this.NIL); } private final TreeNode NIL = new TreeNode(); @Override public void inorder_tree_walk() { inorder_tree_walk((TreeNode)this.getRoot()); } private void inorder_tree_walk(TreeNode t) { if (t != this.NIL) { inorder_tree_walk((TreeNode)t.getLeftChild()); System.out.println(t.getElement()); inorder_tree_walk((TreeNode)t.getRightChild()); } } // 左旋操作 public void left_rotate(TreeNode x) { TreeNode y = (TreeNode) x.getRightChild(); x.setRightChild(y.getLeftChild()); if (y.getLeftChild() != this.NIL) y.getLeftChild().setParent(x); y.setParent(x.getParent()); if (x.getParent() == this.NIL) this.setRoot(y); else if (x == x.getParent().getLeftChild()) x.getParent().setLeftChild(y); else x.getParent().setRightChild(y); y.setLeftChild(x); x.setParent(y); } // 右旋操作 public void right_rotate(TreeNode y) { TreeNode x = (TreeNode) y.getLeftChild(); y.setLeftChild(x.getRightChild()); if (x.getRightChild() != this.NIL) x.getRightChild().setParent(y); x.setParent(y.getParent()); if (y.getParent() == this.NIL) this.setRoot(x); else if (y == y.getParent().getLeftChild()) y.getParent().setLeftChild(x); else y.getParent().setRightChild(x); x.setRightChild(y); y.setParent(x); } // 插入操作 public void tree_insert(TreeNode z) { TreeNode y = this.NIL; TreeNode x = (TreeNode) this.getRoot(); while (x != this.NIL) { y = x; if (z.getElement() < x.getElement()) x = (TreeNode) x.getLeftChild(); else x = (TreeNode) x.getRightChild(); } z.setParent(y); if (y == this.NIL) this.setRoot(z); else if (z.getElement() < y.getElement()) y.setLeftChild(z); else y.setRightChild(z); z.setLeftChild(this.NIL); z.setRightChild(NIL); z.setColor(Color.RED); rb_insert_fixup(z); } // 插入操作后的修正 private void rb_insert_fixup(TreeNode z) { while (((TreeNode) z.getParent()).color == Color.RED) { if (z.getParent() == z.getParent().getParent().getLeftChild()) {// z的父节点是祖父节点的左孩子 TreeNode y = (TreeNode) z.getParent().getParent() .getRightChild(); if (y.color == Color.RED) { ((TreeNode) z.getParent()).color = Color.BLACK; y.color = Color.BLACK; ((TreeNode) z.getParent().getParent()).color = Color.RED; z = (TreeNode) z.getParent().getParent(); } else if (z == z.getParent().getRightChild()) { z = (TreeNode) z.getParent(); left_rotate(z); } else { ((TreeNode) z.getParent()).color = Color.BLACK; TreeNode ff = (TreeNode) z.getParent().getParent(); ff.color = Color.RED; right_rotate(ff); } } else {// //z的父节点是祖父节点的右孩子 TreeNode y = (TreeNode) z.getParent().getParent() .getLeftChild(); if (y.color == Color.RED) { ((TreeNode) z.getParent()).color = Color.BLACK; y.color = Color.BLACK; ((TreeNode) z.getParent().getParent()).color = Color.RED; z = (TreeNode) z.getParent().getParent(); } else if (z == z.getParent().getLeftChild()) { z = (TreeNode) z.getParent(); right_rotate(z); } else { ((TreeNode) z.getParent()).color = Color.BLACK; TreeNode ff = (TreeNode) z.getParent().getParent(); ff.color = Color.RED; left_rotate(ff); } } } ((TreeNode) this.getRoot()).color = Color.BLACK; } public void rb_transplant(TreeNode u, TreeNode v) { if (u.getParent() == this.NIL) this.setRoot(v); else if (u == u.getParent().getLeftChild()) u.getParent().setLeftChild(v); else u.getParent().setRightChild(v); v.setParent(u.getParent()); } public void tree_delete(TreeNode z) { TreeNode y = z; Color y_original_color = y.color; TreeNode x; if (z.getLeftChild() == this.NIL) { x = (TreeNode) z.getRightChild(); rb_transplant(z, (TreeNode) z.getRightChild()); } else if (z.getRightChild() == this.NIL) { x = (TreeNode) z.getLeftChild(); rb_transplant(z, (TreeNode) z.getLeftChild()); } else { y = (TreeNode) tree_minimum(z.getRightChild()); y_original_color = y.color; x = (TreeNode) y.getRightChild(); if (y.getParent() == z) x.setParent(y); else { rb_transplant(y, (TreeNode) y.getRightChild()); y.setRightChild(z.getRightChild()); y.getRightChild().setParent(y); } rb_transplant(z, y); y.setLeftChild(z.getLeftChild()); y.getLeftChild().setParent(y); y.setColor(z.color); } if (y_original_color == Color.BLACK) rb_delete_fixup(x); } private void rb_delete_fixup(TreeNode x) { while (x != this.getRoot() && x.color == Color.BLACK) { if (x == x.getParent().getLeftChild()) { TreeNode w = (TreeNode) x.getParent().getRightChild(); if (w.color == Color.RED) { w.color = Color.BLACK; ((TreeNode) x.getParent()).color = Color.RED; left_rotate((TreeNode) x.getParent()); w = (TreeNode) x.getParent().getRightChild(); } if (((TreeNode) w.getLeftChild()).color == Color.BLACK && ((TreeNode) w.getRightChild()).color == Color.BLACK) { w.color = Color.RED; x = (TreeNode) x.getParent(); } else if (((TreeNode) w.getRightChild()).color == Color.BLACK) { ((TreeNode) w.getLeftChild()).color = Color.BLACK; w.color = Color.RED; right_rotate(w); w = (TreeNode) x.getParent().getRightChild(); } w.color = ((TreeNode) x.getParent()).color; ((TreeNode) x.getParent()).color = Color.BLACK; ((TreeNode) w.getRightChild()).color = Color.BLACK; left_rotate((TreeNode) x.getParent()); x = (TreeNode) this.getRoot(); } else { TreeNode w = (TreeNode) x.getParent().getLeftChild(); if (w.color == Color.RED) { w.color = Color.BLACK; ((TreeNode) x.getParent()).color = Color.RED; right_rotate((TreeNode) x.getParent()); w = (TreeNode) x.getParent().getLeftChild(); } if (((TreeNode) w.getLeftChild()).color == Color.BLACK && ((TreeNode) w.getRightChild()).color == Color.BLACK) { w.color = Color.RED; x = (TreeNode) x.getParent(); } else if (((TreeNode) w.getLeftChild()).color == Color.BLACK) { ((TreeNode) w.getRightChild()).color = Color.BLACK; w.color = Color.RED; left_rotate(w); w = (TreeNode) x.getParent().getLeftChild(); } w.color = ((TreeNode) x.getParent()).color; ((TreeNode) x.getParent()).color = Color.BLACK; ((TreeNode) w.getLeftChild()).color = Color.BLACK; right_rotate((TreeNode) x.getParent()); x = (TreeNode) this.getRoot(); } } x.color = Color.BLACK; } class TreeNode extends BinarySearchTree.TreeNode { private Color color; public Color getColor() { return color; } public void setColor(Color color) { this.color = color; } } enum Color { RED, BLACK } }