/* * 顺序统计树 */ public class OrderStatisticTree { public static final OsTreeNode NIL = new OsTreeNode(RbColor.BLACK,0); private OsTreeNode root = null; public static void main(String[] args) { OrderStatisticTree ost = new OrderStatisticTree(); //测试插入 ost.insertOsTreeNode(new OsTreeNode(11,RbColor.BLACK)); ost.insertOsTreeNode(new OsTreeNode(2,RbColor.RED)); ost.insertOsTreeNode(new OsTreeNode(1,RbColor.BLACK)); ost.insertOsTreeNode(new OsTreeNode(7,RbColor.BLACK)); ost.insertOsTreeNode(new OsTreeNode(5,RbColor.RED)); ost.insertOsTreeNode(new OsTreeNode(8,RbColor.RED)); ost.insertOsTreeNode(new OsTreeNode(14,RbColor.BLACK)); ost.insertOsTreeNode(new OsTreeNode(15,RbColor.RED)); ost.printTree(); ost.deleteOsTreeNode(ost.searchOsTreeNode(ost.root, 7)); ost.printTree(); //打印第i小的数 System.out.println(ost.osSelect(ost.root,7).key); //找某一节点的序 System.out.println(ost.osRank(ost.searchOsTreeNode(ost.root, 14))); } public OrderStatisticTree() { this.root = NIL; } //中序遍历二叉树 private void traverseTree(OsTreeNode x) { if(x != NIL) { traverseTree(x.left); System.out.println(x.key + " " + x.color + " "+x.size); traverseTree(x.right); } } private void printTree() { System.out.println("root:"+root.key+" "+root.color); traverseTree(root); System.out.println(); } //设置顺序统计树每个节点的size // private int setOsTreeNodeSize(OSTreeNode x) { // if(x == NIL) { // return 0; // } else { // return setOsTreeNodeSize(x.left)+setOsTreeNodeSize(x.right)+1; // } // } //找到第i小关键字的节点 private OsTreeNode osSelect(OsTreeNode x,int i) { if(i<0) { System.out.println("invalidate parameter!"); return null; } int r = x.left.size+1; if(i==r) { return x; } else if(i<r) { return osSelect(x.left,i); } else { return osSelect(x.right,i-r); } } //找到x节点的序 private int osRank(OsTreeNode x) { int r = x.left.size+1; OsTreeNode y=x; while(y != root) { if(y == y.parent.right) { r = r + y.parent.left.size + 1; } y = y.parent; } return r; } //查找某一子节点 private OsTreeNode searchOsTreeNode(OsTreeNode x,int key) { while(x != NIL && key != x.key) { if(key < x.key) { x = x.left; } else { x = x.right; } } return x; } //插入某一子节点 private void insertOsTreeNode(OsTreeNode z) { OsTreeNode y = NIL; OsTreeNode x = root; while(x != NIL) { y = x; if(z.key < x.key) { x = x.left; } else { x = x.right; } } z.parent = y; if(y == NIL) { root = z; } else if(z.key < y.key) { y.left = z; } else { y.right = z; } z.left = NIL; z.right = NIL; z.color = RbColor.RED; //插入后成了叶节点,叶节点size为1 z.size = 1; sizeFixUp(z.parent); osInsertFixUp(z); //插入修正 } //插入修正 private void osInsertFixUp(OsTreeNode z) { OsTreeNode y = null; while(z.parent.color == RbColor.RED) { //当z的父节点是黑色时,不需要矫正 if(z.parent == z.parent.parent.left) { //左分支情况 y = z.parent.parent.right; //根据叔节点分情况 if(y.color == RbColor.RED) { z.parent.color = RbColor.BLACK; y.color = RbColor.BLACK; z.parent.parent.color = RbColor.RED; z = z.parent.parent; } else { if(z == z.parent.right) { z = z.parent; leftRotate(z); } z.parent.color = RbColor.BLACK; z.parent.parent.color = RbColor.RED; rightRotate(z.parent.parent); } } else { y = z.parent.parent.left; //根据叔节点分情况 if(y.color == RbColor.RED) { z.parent.color = RbColor.BLACK; y.color = RbColor.BLACK; z.parent.parent.color = RbColor.RED; z = z.parent.parent; } else { if(z == z.parent.left) { z = z.parent; rightRotate(z); } z.parent.color = RbColor.BLACK; z.parent.parent.color = RbColor.RED; leftRotate(z.parent.parent); } } } root.color = RbColor.BLACK; } //删除某一子节点 private void deleteOsTreeNode(OsTreeNode z) { OsTreeNode y = z; OsTreeNode x = NIL; RbColor yOriginalColor = y.color; if(z.left == NIL) { x = z.right; osTransplant(z,z.right); z.right.size--; sizeFixUp(z.right.parent); //修复从根节点到z节点路径的size } else if(z.right == NIL) { z.parent.size--; sizeFixUp(z.right.parent); x = z.left; osTransplant(z,z.left); z.left.size--; sizeFixUp(z.left.parent); //修复从根节点到z节点路径的size } else { y = searchMinNode(z.right); yOriginalColor = y.color; x = y.right; if(y.parent == z) { x.parent = y; } else { osTransplant(y,y.right); y.right = z.right; z.right.parent = y; } osTransplant(z,y); y.left = z.left; z.left.parent = y; y.color = z.color; x.parent.size--; sizeFixUp(x.parent.parent); //修复从根节点到z节点路径的size } if(yOriginalColor == RbColor.BLACK) { osDeleteFixUp(x); } } private void sizeFixUp(OsTreeNode x) { OsTreeNode y = x; while(y != NIL) { y.size = y.left.size + y.right.size + 1; y = y.parent; } } private void osDeleteFixUp(OsTreeNode x) { //x总是指向一个具有双重黑色的非根节点 OsTreeNode w = NIL; while(x != root && x.color == RbColor.BLACK) { if(x == x.parent.left) { w = x.parent.right; //w指向兄节点 if(w.color == RbColor.RED) { w.color = RbColor.BLACK; //case 1 x.parent.color = RbColor.RED; //case 1 leftRotate(x.parent); //case 1 w = x.parent.right; //case 1 } if(w.left.color == RbColor.BLACK && w.right.color == RbColor.BLACK) { w.color = RbColor.BLACK; //case 2 x = x.parent; //case 2 } else { if(w.right.color == RbColor.BLACK) { w.left.color = RbColor.BLACK; //case 3 w.color = RbColor.RED; //case 3 rightRotate(w); //case 3 w = x.parent.right; //case 3 } w.color = x.parent.color; //case 4 x.parent.color = RbColor.BLACK; //case 4 w.right.color = RbColor.BLACK; //case 4 leftRotate(x.parent); //case 4 x = root; //case 4 } } else { w = x.parent.left; //w指向兄节点 if(w.color == RbColor.RED) { w.color = RbColor.BLACK; //case 1 x.parent.color = RbColor.RED; //case 1 rightRotate(x.parent); //case 1 w = x.parent.left; //case 1 } if(w.right.color == RbColor.BLACK && w.left.color == RbColor.BLACK) { w.color = RbColor.BLACK; //case 2 x = x.parent; //case 2 } else { if(w.left.color == RbColor.BLACK) { w.right.color = RbColor.BLACK; //case 3 w.color = RbColor.RED; //case 3 leftRotate(w); //case 3 w = x.parent.left; //case 3 } w.color = x.parent.color; x.parent.color = RbColor.BLACK; w.left.color = RbColor.BLACK; rightRotate(x.parent); x = root; } } } } private void osTransplant(OsTreeNode u,OsTreeNode v) { if(u.parent == NIL) { root = v; } else if(u == u.parent.left) { u.parent.left = v; } else { u.parent.right = v; } v.parent = u.parent; } //获取最小键值节点 private OsTreeNode searchMinNode(OsTreeNode x) { while(x.left != NIL) { x = x.left; } return x; } //获取最大键值节点 private OsTreeNode searchMaxNode(OsTreeNode x) { while(x.right != NIL) { x = x.right; } return x; } //左旋 private void leftRotate(OsTreeNode x) { OsTreeNode y = x.right; x.right = y.left; if(x.right != NIL) { y.left.parent = x; } y.parent = x.parent; if(x.parent == NIL) { //如果是根节点 root = y; } else if(x == x.parent.left) { x.parent.left = y; } else { x.parent.right = y; } y.left = x; x.parent = y; //size属性维护 y.size = x.size; x.size = x.left.size + x.right.size + 1; } //右旋 private void rightRotate(OsTreeNode y) { OsTreeNode x = y.left; y.left = x.right; if(x.right != NIL) { x.right.parent = y; } x.parent = y.parent; if(y.parent == NIL) { root = x; } else if(y == y.parent.left) { y.parent.left = x; } else { y.parent.right = x; } x.right = y; y.parent = x; //size属性维护 x.size = y.size; y.size = y.left.size + y.right.size + 1; } //红黑树节点类 private static class OsTreeNode { OsTreeNode left = null; OsTreeNode right = null; OsTreeNode parent = null; RbColor color = RbColor.RED; int key = 0; int size = 0; public OsTreeNode(int key,RbColor color) { this.key = key; this.color = color; } public OsTreeNode(RbColor color,int size) { this.color = color; this.size = size; } } private enum RbColor { RED,BLACK } }
原文地址:http://blog.csdn.net/q389281541/article/details/44983465