算法之红黑树

  1. package com.eshore.sweetop.dataframe;
  2. import com.eshore.sweetop.data.KeyData;
  3. import com.eshore.sweetop.data.Node;
  4. import com.eshore.sweetop.data.RBNode;
  5. public class RBTree {
  6.     private RBNode root;
  7.     private static final RBNode NIL = RBNode.getRBNode();
  8.     public RBTree() {
  9.         root = NIL;
  10.     }
  11.     public void insert(RBNode node) {
  12.         RBNode y = NIL;
  13.         RBNode x = root;
  14.         while (x != NIL) {
  15.             y = x;
  16.             if (node.getData().getKey() < x.getData().getKey()) {
  17.                 x = x.getLeft();
  18.             } else {
  19.                 x = x.getRight();
  20.             }
  21.         }
  22.         node.setParent(y);
  23.         if (y == NIL) {
  24.             root = node;
  25.         } else if (node.getData().getKey() < y.getData().getKey()) {
  26.             y.setLeft(node);
  27.         } else {
  28.             y.setRight(node);
  29.         }
  30.         node.setLeft(NIL);
  31.         node.setRight(NIL);
  32.         node.setColor(RBNode.RED);
  33.         insertFixup(node);
  34.     }
  35.     public void delete(RBNode node) {
  36.         RBNode tempy=NIL, tempx=NIL;
  37.         if (node.getLeft() == NIL || node.getRight() == NIL) {
  38.             tempy = node;
  39.         } else {
  40.             tempy = successor(node);
  41.         }
  42.         if (tempy.getLeft() != NIL) {
  43.             tempx = tempy.getLeft();
  44.         } else {
  45.             tempx = tempy.getRight();
  46.         }
  47.         tempx.setParent(tempy.getParent());
  48.         if (tempy.getParent() == NIL) {
  49.             root = tempx;
  50.         } else if (tempy == tempy.getParent().getLeft()) {
  51.             tempy.getParent().setLeft(tempx);
  52.         } else {
  53.             tempy.getParent().setRight(tempx);
  54.         }
  55.         if (tempy != node) {
  56.             node.setData(tempy.getData());
  57.         }
  58.         if(tempy.getColor()==RBNode.BLACK){
  59.             deleteFixup(tempx);
  60.         }
  61.     }
  62.     
  63.     private void deleteFixup(RBNode node){
  64.        
  65.       RBNode tempw=NIL;
  66.       while(node!=root && node.getColor()==RBNode.BLACK){
  67. if(node==node.getParent().getLeft()){
  68. tempw=node.getParent().getRight();
  69. if(tempw.getColor()==RBNode.RED){
  70. tempw.setColor(RBNode.BLACK);
  71. node.getParent().setColor(RBNode.RED);
  72. leftRotate(node.getParent());
  73. tempw=node.getParent().getRight();
  74. }
  75. if(tempw.getLeft().getColor()==RBNode.BLACK && tempw.getRight().getColor()==RBNode.BLACK){
  76. tempw.setColor(RBNode.RED);
  77. node=node.getParent();
  78. }else{
  79. if(tempw.getRight().getColor()==RBNode.BLACK){
  80. tempw.getLeft().setColor(RBNode.BLACK);
  81. tempw.setColor(RBNode.RED);
  82. rightRotate(tempw);
  83. }
  84. tempw.setColor(node.getParent().getColor());
  85. node.getParent().setColor(RBNode.BLACK);
  86. tempw.getRight().setColor(RBNode.BLACK);
  87. leftRotate(node.getParent());
  88. break;
  89. }
  90. }else{
  91. tempw=node.getParent().getLeft();
  92. if(tempw.getColor()==RBNode.RED){
  93. System.out.println("222");
  94. tempw.setColor(RBNode.BLACK);
  95. node.getParent().setColor(RBNode.RED);
  96. rightRotate(node.getParent());
  97. tempw=node.getParent().getLeft();
  98. }
  99. if(tempw.getLeft().getColor()==RBNode.BLACK && tempw.getRight().getColor()==RBNode.BLACK){
  100. tempw.setColor(RBNode.RED);
  101. node=node.getParent();
  102. }else{
  103. if(tempw.getLeft().getColor()==RBNode.BLACK){
  104. tempw.getRight().setColor(RBNode.BLACK);
  105. tempw.setColor(RBNode.RED);
  106. leftRotate(tempw);
  107. }
  108. tempw.setColor(node.getParent().getColor());
  109. node.getParent().setColor(RBNode.BLACK);
  110. tempw.getLeft().setColor(RBNode.BLACK);
  111. rightRotate(node.getParent());
  112. break;
  113. }
  114. }
  115. }
  116. node.setColor(RBNode.BLACK);
  117.     }
  118.     private void leftRotate(RBNode node) {
  119.         RBNode y = node.getRight();
  120.         node.setRight(y.getLeft());
  121.         if (y.getLeft() != NIL) {
  122.             y.getLeft().setParent(node);
  123.         }
  124.         y.setParent(node.getParent());
  125.         if (node.getParent() == NIL) {
  126.             root = y;
  127.         } else if (node == node.getParent().getLeft()) {
  128.             node.getParent().setLeft(y);
  129.         } else {
  130.             node.getParent().setRight(y);
  131.         }
  132.         y.setLeft(node);
  133.         node.setParent(y);
  134.     }
  135.     private void rightRotate(RBNode node) {
  136.         RBNode x = node.getLeft();
  137.         node.setLeft(x.getRight());
  138.         if (x.getRight() != NIL) {
  139.             x.getRight().setParent(node);
  140.         }
  141.         x.setParent(node.getParent());
  142.         if (node.getParent() == NIL) {
  143.             root = x;
  144.         } else if (node == node.getParent().getLeft()) {
  145.             node.getParent().setLeft(x);
  146.         } else {
  147.             node.getParent().setRight(x);
  148.         }
  149.         x.setRight(node);
  150.         node.setParent(x);
  151.     }
  152.     public void insertFixup(RBNode node) {
  153.         RBNode y = NIL;
  154.         while (node.getParent().getColor() == RBNode.RED) {
  155.             if (node.getParent() == node.getParent().getParent().getLeft()) {
  156.                 y = node.getParent().getParent().getRight();
  157.                 if (y.getColor() == RBNode.RED) {
  158.                     node.getParent().setColor(RBNode.BLACK);
  159.                     y.setColor(RBNode.BLACK);
  160.                     node.getParent().getParent().setColor(RBNode.RED);
  161.                     node = node.getParent().getParent();
  162.                 } else {
  163.                     if (node == node.getParent().getRight()) {
  164.                         node = node.getParent();
  165.                         leftRotate(node);
  166.                     }
  167.                     node.getParent().setColor(RBNode.BLACK);
  168.                     node.getParent().getParent().setColor(RBNode.RED);
  169.                     rightRotate(node.getParent().getParent());
  170.                 }
  171.             } else {
  172.                 y = node.getParent().getParent().getLeft();
  173.                 if (y.getColor() == RBNode.RED) {
  174.                     node.getParent().setColor(RBNode.BLACK);
  175.                     y.setColor(RBNode.BLACK);
  176.                     node.getParent().getParent().setColor(RBNode.RED);
  177.                     node = node.getParent().getParent();
  178.                 } else {
  179.                     if (node == node.getParent().getLeft()) {
  180.                         node = node.getParent();
  181.                         rightRotate(node);
  182.                     }
  183.                     node.getParent().setColor(RBNode.BLACK);
  184.                     node.getParent().getParent().setColor(RBNode.RED);
  185.                     leftRotate(node.getParent().getParent());
  186.                 }
  187.             }
  188.         }
  189.         root.setColor(RBNode.BLACK);
  190.     }
  191.     public void walk() {
  192.         walk(root);
  193.     }
  194.     private void walk(RBNode node) {
  195.         if (node != NIL) {
  196.             walk(node.getLeft());
  197.             System.out.println(node.getData() + ":" + node.getColor());
  198.             walk(node.getRight());
  199.         }
  200.     }
  201.     public RBNode search(int k) {
  202.         RBNode node = root;
  203.         while (node != NIL && k != node.getData().getKey()) {
  204.             if (k < node.getData().getKey()) {
  205.                 node = node.getLeft();
  206.             } else {
  207.                 node = node.getRight();
  208.             }
  209.         }
  210.         return node;
  211.     }
  212.     public RBNode min(RBNode node) {
  213.         while (node.getLeft() != NIL) {
  214.             node = node.getLeft();
  215.         }
  216.         return node;
  217.     }
  218.     public RBNode min() {
  219.         return min(root);
  220.     }
  221.     public RBNode successor(RBNode node) {
  222.         if (node.getRight() != NIL) {
  223.             return min(node.getRight());
  224.         }
  225.         RBNode y = node.getParent();
  226.         while (y != NIL && node == y.getRight()) {
  227.             node = y;
  228.             y = y.getParent();
  229.         }
  230.         return y;
  231.     }
  232.     public RBNode max(RBNode node) {
  233.         while (node.getRight() != NIL) {
  234.             node = node.getRight();
  235.         }
  236.         return node;
  237.     }
  238.     public RBNode max() {
  239.         return max(root);
  240.     }
  241.     public static void main(String[] args) {
  242.         RBTree bt = new RBTree();
  243.         int[] id = { 121481563 };
  244.         RBNode node = null;
  245.         for (int i = 0; i < id.length; i++) {
  246.             node = new RBNode();
  247.             node.setData(new KeyData(id[i]));
  248.             bt.insert(node);
  249.         }
  250.         bt.walk();
  251.         System.out.println("=====================");
  252.         System.out.println("Root"+bt.root.getData());
  253.         System.out.println("Max:" + bt.max().getData());
  254.         System.out.println("Min:" + bt.min().getData());
  255.         System.out.println(bt.search(8).getData());
  256.         System.out.println(bt.successor(bt.search(8)).getData());
  257.         bt.delete(bt.search(2));
  258.         System.out.println("Root"+bt.root.getData());
  259.         bt.walk();
  260.     }
  261. }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值