算法之红黑树

Posted 吴冬冬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法之红黑树相关的知识,希望对你有一定的参考价值。

  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. if(tempw.getLeft().getColor()==RBNode.BLACK && tempw.getRight().getColor()==RBNode.BLACK)
  75. tempw.setColor(RBNode.RED);
  76. node=node.getParent();
  77. else
  78. if(tempw.getRight().getColor()==RBNode.BLACK)
  79. tempw.getLeft().setColor(RBNode.BLACK);
  80. tempw.setColor(RBNode.RED);
  81. rightRotate(tempw);
  82. tempw.setColor(node.getParent().getColor());
  83. node.getParent().setColor(RBNode.BLACK);
  84. tempw.getRight().setColor(RBNode.BLACK);
  85. leftRotate(node.getParent());
  86. break;
  87. else
  88. tempw=node.getParent().getLeft();
  89. if(tempw.getColor()==RBNode.RED)
  90. System.out.println("222");
  91. tempw.setColor(RBNode.BLACK);
  92. node.getParent().setColor(RBNode.RED);
  93. rightRotate(node.getParent());
  94. tempw=node.getParent().getLeft();
  95. if(tempw.getLeft().getColor()==RBNode.BLACK && tempw.getRight().getColor()==RBNode.BLACK)
  96. tempw.setColor(RBNode.RED);
  97. node=node.getParent();
  98. else
  99. if(tempw.getLeft().getColor()==RBNode.BLACK)
  100. tempw.getRight().setColor(RBNode.BLACK);
  101. tempw.setColor(RBNode.RED);
  102. leftRotate(tempw);
  103. tempw.setColor(node.getParent().getColor());
  104. node.getParent().setColor(RBNode.BLACK);
  105. tempw.getLeft().setColor(RBNode.BLACK);
  106. rightRotate(node.getParent());
  107. break;
  108. node.setColor(RBNode.BLACK);
  109.     
  110.     private void leftRotate(RBNode node) 
  111.         RBNode y = node.getRight();
  112.         node.setRight(y.getLeft());
  113.         if (y.getLeft() != NIL) 
  114.             y.getLeft().setParent(node);
  115.         
  116.         y.setParent(node.getParent());
  117.         if (node.getParent() == NIL) 
  118.             root = y;
  119.          else if (node == node.getParent().getLeft()) 
  120.             node.getParent().setLeft(y);
  121.          else 
  122.             node.getParent().setRight(y);
  123.         
  124.         y.setLeft(node);
  125.         node.setParent(y);
  126.     
  127.     private void rightRotate(RBNode node) 
  128.         RBNode x = node.getLeft();
  129.         node.setLeft(x.getRight());
  130.         if (x.getRight() != NIL) 
  131.             x.getRight().setParent(node);
  132.         
  133.         x.setParent(node.getParent());
  134.         if (node.getParent() == NIL) 
  135.             root = x;
  136.          else if (node == node.getParent().getLeft()) 
  137.             node.getParent().setLeft(x);
  138.          else 
  139.             node.getParent().setRight(x);
  140.         
  141.         x.setRight(node);
  142.         node.setParent(x);
  143.     
  144.     public void insertFixup(RBNode node) 
  145.         RBNode y = NIL;
  146.         while (node.getParent().getColor() == RBNode.RED) 
  147.             if (node.getParent() == node.getParent().getParent().getLeft()) 
  148.                 y = node.getParent().getParent().getRight();
  149.                 if (y.getColor() == RBNode.RED) 
  150.                     node.getParent().setColor(RBNode.BLACK);
  151.                     y.setColor(RBNode.BLACK);
  152.                     node.getParent().getParent().setColor(RBNode.RED);
  153.                     node = node.getParent().getParent();
  154.                  else 
  155.                     if (node == node.getParent().getRight()) 
  156.                         node = node.getParent();
  157.                         leftRotate(node);
  158.                     
  159.                     node.getParent().setColor(RBNode.BLACK);
  160.                     node.getParent().getParent().setColor(RBNode.RED);
  161.                     rightRotate(node.getParent().getParent());
  162.                 
  163.              else 
  164.                 y = node.getParent().getParent().getLeft();
  165.                 if (y.getColor() == RBNode.RED) 
  166.                     node.getParent().setColor(RBNode.BLACK);
  167.                     y.setColor(RBNode.BLACK);
  168.                     node.getParent().getParent().setColor(RBNode.RED);
  169.                     node = node.getParent().getParent();
  170.                  else 
  171.                     if (node == node.getParent().getLeft()) 
  172.                         node = node.getParent();
  173.                         rightRotate(node);
  174.                     
  175.                     node.getParent().setColor(RBNode.BLACK);
  176.                     node.getParent().getParent().setColor(RBNode.RED);
  177.                     leftRotate(node.getParent().getParent());
  178.                 
  179.             
  180.         
  181.         root.setColor(RBNode.BLACK);
  182.     
  183.     public void walk() 
  184.         walk(root);
  185.     
  186.     private void walk(RBNode node) 
  187.         if (node != NIL) 
  188.             walk(node.getLeft());
  189.             System.out.println(node.getData() + ":" + node.getColor());
  190.             walk(node.getRight());
  191.         
  192.     
  193.     public RBNode search(int k) 
  194.         RBNode node = root;
  195.         while (node != NIL && k != node.getData().getKey()) 
  196.             if (k < node.getData().getKey()) 
  197.                 node = node.getLeft();
  198.              else 
  199.                 node = node.getRight();
  200.             
  201.         
  202.         return node;
  203.     
  204.     public RBNode min(RBNode node) 
  205.         while (node.getLeft() != NIL) 
  206.             node = node.getLeft();
  207.         
  208.         return node;
  209.     
  210.     public RBNode min() 
  211.         return min(root);
  212.     
  213.     public RBNode successor(RBNode node) 
  214.         if (node.getRight() != NIL) 
  215.             return min(node.getRight());
  216.         
  217.         RBNode y = node.getParent();
  218.         while (y != NIL && node == y.getRight()) 
  219.             node = y;
  220.             y = y.getParent();
  221.         
  222.         return y;
  223.     
  224.     public RBNode max(RBNode node) 
  225.         while (node.getRight() != NIL) 
  226.             node = node.getRight();
  227.         
  228.         return node;
  229.     
  230.     public RBNode max() 
  231.         return max(root);
  232.     
  233.     public static void main(String[] args) 
  234.         RBTree bt = new RBTree();
  235.         int[] id =  121481563 ;
  236.         RBNode node = null;
  237.         for (int i = 0; i < id.length; i++) 
  238.             node = new RBNode();
  239.             node.setData(new KeyData(id[i]));
  240.             bt.insert(node);
  241.         
  242.         bt.walk();
  243.         System.out.println("=====================");
  244.         System.out.println("Root"+bt.root.getData());
  245.         System.out.println("Max:" + bt.max().getData());
  246.         System.out.println("Min:" + bt.min().getData());
  247.         System.out.println(bt.search(8).getData());
  248.         System.out.println(bt.successor(bt.search(8)).getData());
  249.         bt.delete(bt.search(2));
  250.         System.out.println("Root"+bt.root.getData());
  251.         bt.walk();
  252.     

以上是关于算法之红黑树的主要内容,如果未能解决你的问题,请参考以下文章

算法之红黑树

数据结构与算法之红黑树

算法基础8:平衡树之红黑树

算法导论之红黑树的学习

浅谈算法和数据结构: 九 平衡查找树之红黑树

浅谈算法和数据结构:平衡查找树之红黑树