zoukankan      html  css  js  c++  java
  • Java实现红黑树

    实现红黑树的编码,得先了解红黑树的性质,并结合性质理解红黑树的插入、删除等操作。这里推荐博客http://www.cnblogs.com/skywang12345/p/3245399.html,里面配有图文讲解,讲的非常详细具体。

    以下是我自己封装实现的一个红黑树的类。

      1 package com.example.lenovo.linehough;
      2 
      3 public class GRBTree {
      4     int iCount;
      5     int[] treeValue;
      6     GRBTreeNode root;
      7     boolean BLACK = false;
      8     boolean RED = true;
      9 
     10     public GRBTree() {
     11         root = null;
     12     }
     13 
     14     public GRBTree(int i) {
     15         Free();
     16     }
     17 
     18     public class GRBTreeNode {
     19         int key;
     20         boolean color;
     21         GRBTreeNode left, right, parent;
     22 
     23         public GRBTreeNode(int newKey, boolean newColor, GRBTreeNode newLeft, GRBTreeNode newRight) {
     24             key = newKey;
     25             color = newColor;
     26             left = newLeft;
     27             right = newRight;
     28             if (left != null)
     29                 left.parent = this;
     30             if (right != null)
     31                 right.parent = this;
     32             parent = null;
     33         }
     34 
     35         public GRBTreeNode() {
     36             if (left != null)
     37                 left = null;
     38             if (right != null)
     39                 right = null;
     40         }
     41     }
     42 
     43     void Free() {
     44         if (root != null)
     45             root = null;
     46     }
     47 
     48     void Dereference() {
     49         root = null;
     50     }
     51 
     52     public GRBTreeNode Grandparent(GRBTreeNode n) {
     53         if (n == null || n.parent == null)
     54             return null;
     55         return n.parent.parent;
     56     }
     57 
     58     public GRBTreeNode Sibling(GRBTreeNode n) {
     59         if (n == null || n.parent == null)
     60             return null;
     61         if (n == n.parent.left)
     62             return n.parent.right;
     63         else
     64             return n.parent.left;
     65     }
     66 
     67     public GRBTreeNode Uncle(GRBTreeNode n) {
     68         if (n == null)
     69             return null;
     70         return Sibling(n.parent);
     71     }
     72 
     73     boolean ColorOf(GRBTreeNode n) {
     74         return n == null ? BLACK : n.color;
     75     }
     76 
     77     public GRBTreeNode Find(int keyToFind) {
     78         GRBTreeNode n = root;
     79         while (n != null) {
     80             if (keyToFind == n.key)
     81                 return n;
     82             if (keyToFind < n.key)
     83                 n = n.left;
     84             else
     85                 n = n.right;
     86         }
     87         return n;
     88     }
     89 
     90     void Replace(GRBTreeNode oldNode, GRBTreeNode newNode) {
     91         if (oldNode.parent == null)
     92             root = newNode;
     93         else {
     94             if (oldNode == oldNode.parent.left)
     95                 oldNode.parent.left = newNode;
     96             else
     97                 oldNode.parent.right = newNode;
     98         }
     99         if (newNode != null)
    100             newNode.parent = oldNode.parent;
    101     }
    102 
    103     void RotateLeft(GRBTreeNode n) {
    104         GRBTreeNode r = n.right;
    105         Replace(n, r);
    106         n.right = r.left;
    107         if (r.left != null)
    108             r.left.parent = n;
    109         r.left = n;
    110         n.parent = r;
    111     }
    112 
    113     void RotateRight(GRBTreeNode n) {
    114         GRBTreeNode l = n.left;
    115         Replace(n, l);
    116         n.left = l.right;
    117         if (l.right != null)
    118             l.right.parent = n;
    119         l.right = n;
    120         n.parent = l;
    121     }
    122 
    123     void Insert1(GRBTreeNode n) {
    124         if (n.parent == null)
    125             n.color = BLACK;
    126         else
    127             Insert2(n);
    128     }
    129 
    130     void Insert2(GRBTreeNode n) {
    131         if (n.parent.color != BLACK)
    132             Insert3(n);
    133     }
    134 
    135     void Insert3(GRBTreeNode n) {
    136         GRBTreeNode u = Uncle(n);
    137         GRBTreeNode g = Grandparent(n);
    138         if (ColorOf(u) == RED) {
    139             n.parent.color = BLACK;
    140             u.color = BLACK;
    141             g.color = RED;
    142             Insert1(g);
    143         } else
    144             Insert4(n);
    145     }
    146 
    147     void Insert4(GRBTreeNode n) {
    148         GRBTreeNode g = Grandparent(n);
    149         if (n == n.parent.right && n.parent == g.left) {
    150             RotateLeft(n.parent);
    151             n = n.left;
    152         } else if (n == n.parent.left && n.parent == g.right) {
    153             RotateRight(n.parent);
    154             n = n.right;
    155         }
    156         Insert5(n);
    157     }
    158 
    159     void Insert5(GRBTreeNode n) {
    160         GRBTreeNode g = Grandparent(n);
    161         n.parent.color = BLACK;
    162         g.color = RED;
    163         if (n == n.parent.left && n.parent == g.left)
    164             RotateRight(g);
    165         else
    166             RotateLeft(g);
    167     }
    168 
    169     boolean Insert(int newKey) {
    170         GRBTreeNode insNode = new GRBTreeNode(newKey, RED, null, null);
    171         GRBTreeNode n;
    172 
    173         if (root == null)
    174             root = insNode;
    175         else {
    176             n = root;
    177             while (true) {
    178                 if (newKey == n.key) {
    179                     return false;
    180                 }
    181 
    182                 if (newKey < n.key) {
    183                     if (n.left == null) {
    184                         n.left = insNode;
    185                         break;
    186                     } else
    187                         n = n.left;
    188                 } else {
    189                     if (n.right == null) {
    190                         n.right = insNode;
    191                         break;
    192                     } else
    193                         n = n.right;
    194                 }
    195             }
    196             insNode.parent = n;
    197         }
    198 
    199         Insert1(insNode);
    200 
    201         return true;
    202     }
    203 
    204     public GRBTreeNode Maximum(GRBTreeNode n) {
    205         if (n == null)
    206             return null;
    207 
    208         while (n.right != null)
    209             n = n.right;
    210         return n;
    211     }
    212 
    213     public GRBTreeNode Minimum(GRBTreeNode n) {
    214         if (n == null)
    215             return null;
    216 
    217         while (n.left != null)
    218             n = n.left;
    219         return n;
    220     }
    221 
    222     void Delete1(GRBTreeNode n) {
    223         if (n.parent != null)
    224             Delete2(n);
    225     }
    226 
    227     void Delete2(GRBTreeNode n) {
    228         GRBTreeNode s = Sibling(n);
    229 
    230         if (ColorOf(s) == RED) {
    231             n.parent.color = RED;
    232             s.color = BLACK;
    233 
    234             if (n == n.parent.left) {
    235                 RotateLeft(n.parent);
    236             } else {
    237                 RotateRight(n.parent);
    238             }
    239         }
    240         Delete3(n);
    241     }
    242 
    243     void Delete3(GRBTreeNode n) {
    244         GRBTreeNode s = Sibling(n);
    245 
    246         if (ColorOf(n.parent) == BLACK && ColorOf(s) == BLACK &&
    247                 ColorOf(s.left) == BLACK && ColorOf(s.right) == BLACK) {
    248             s.color = RED;
    249             Delete1(n.parent);
    250         } else
    251             Delete4(n);
    252     }
    253 
    254     void Delete4(GRBTreeNode n) {
    255         GRBTreeNode s = Sibling(n);
    256 
    257         if (ColorOf(n.parent) == RED && ColorOf(s) == BLACK &&
    258                 ColorOf(s.left) == BLACK && ColorOf(s.right) == BLACK) {
    259             s.color = RED;
    260             n.parent.color = BLACK;
    261         } else
    262             Delete5(n);
    263     }
    264 
    265     void Delete5(GRBTreeNode n) {
    266         GRBTreeNode s = Sibling(n);
    267 
    268         if (n == n.parent.left &&
    269                 ColorOf(s) == BLACK && ColorOf(s.left) == RED && ColorOf(s.right) == BLACK) {
    270             s.color = RED;
    271             s.left.color = BLACK;
    272             RotateRight(s);
    273         } else if (n == n.parent.right &&
    274                 ColorOf(s) == BLACK && ColorOf(s.right) == RED && ColorOf(s.left) == BLACK) {
    275             s.color = RED;
    276             s.right.color = BLACK;
    277             RotateLeft(s);
    278         }
    279         Delete6(n);
    280     }
    281 
    282     void Delete6(GRBTreeNode n) {
    283         GRBTreeNode s = Sibling(n);
    284 
    285         s.color = ColorOf(n.parent);
    286         n.parent.color = BLACK;
    287         if (n == n.parent.left) {
    288             s.right.color = BLACK;
    289             RotateLeft(n.parent);
    290         } else {
    291             s.left.color = BLACK;
    292             RotateRight(n.parent);
    293         }
    294     }
    295 
    296     void Delete(int keyToDel) {
    297         GRBTreeNode c;
    298         GRBTreeNode n = Find(keyToDel);
    299         if (n == null)
    300             return;
    301 
    302         if (n.left != null && n.right != null) {
    303             GRBTreeNode pred = Maximum(n.left);
    304             n.key = pred.key;
    305             n = pred;
    306         }
    307 
    308         c = n.right == null ? n.left : n.right;
    309         if (ColorOf(n) == BLACK) {
    310             n.color = ColorOf(c);
    311             Delete1(n);
    312         }
    313         Replace(n, c);
    314         if (n.parent == null && c != null)
    315             c.color = BLACK;
    316 
    317         n.left = null;
    318         n.right = null;
    319     }
    320 
    321     /*   前序遍历的结果放到一个数组里面*/
    322     private void preOrder(GRBTreeNode n, int width, int height) {
    323 
    324         if (n != null) {
    325             treeValue[iCount] = n.key;
    326             iCount++;
    327             preOrder(n.left, width, height);
    328             preOrder(n.right, width, height);
    329         }
    330 
    331     }
    332 
    333     public int[] preOrder(int width, int height) {
    334         treeValue = new int[width * height];
    335         iCount = 0;
    336         preOrder(root, width, height);
    337         return treeValue;
    338     }
    339 
    340     public int getiCount() {
    341         return iCount;
    342     }
    343 }
  • 相关阅读:
    WPF应用程序中获取参数
    访问远程oracle数据库时TNS操作超时
    VS2010不能引用System.Data.OracleClient解决方法
    Windows系统下完全卸载Oracle
    创建WPF单实例应用程序
    Winform 版本信息
    SQL Date Time format
    Union合并数组(去掉重复的项目)
    SQL数据类型nchar,char,varchar与nvarchar区别
    Sql语句 生日提醒
  • 原文地址:https://www.cnblogs.com/gxclmx/p/7500970.html
Copyright © 2011-2022 走看看