• the implemention of redblack tree


      1 public class redbalcktree {
      2     
      3      private  class Node{
      4            private int val;
      5            private int key;
      6            boolean color;    //black true
      7            private Node left,right,p;
      8            private int N;   //the number of the all nodes of its child nodes and itself
      9            //private int num;//the number
     10            public Node(int val,int key){
     11                this.val = val; this.key = key;
     12            }
     13        
     14  }
     15      
     16      Node root;
     17     
     18     private void leftrotation(Node x){
     19         Node y = x.right;
     20         x.right = y.left;
     21         if(y.left != null){
     22             y.left.p = x;
     23         }
     24         y.p = x.p;
     25         if(x.p == null){
     26             root = y;
     27         }
     28         else if(x == x.p.left){
     29             x.p.left = y;
     30         }
     31         else{x.p.right = y;}
     32         y.left = x;
     33         x.p = y;
     34     }
     35     
     36     private void rightrotation(Node y){
     37         Node x = y.left;
     38         y.left = x.right;
     39         if(x.right != null){
     40             x.right.p = y;
     41         }
     42         x.p = y.p;
     43         if(y.p == null){
     44             root = x;
     45         }
     46         else if(y == y.p.left){
     47             y.p.left = x;
     48         }
     49         else{y.p.right = x;}
     50         x.right = y;
     51         y.p = x;
     52     }
     53     
     54     public void insert(int val,int key){
     55         Node y = null;
     56         Node x = root;
     57         Node z = new Node(val,key);
     58         if(x == null){root = z;}
     59         while(x != null){
     60             y = x;
     61             if(z.key < x.key){
     62                 x = x.left;
     63             }
     64             else{x = x.right;}
     65         }
     66         z.p = y;
     67        if(z.key < y.key){
     68            y.left = z;
     69        }
     70        else{y.right = z;}
     71        z.left = null;
     72        z.right = null;
     73        z.color = false;
     74        inseretfix(z);
     75         
     76     }
     77     
     78     private void inseretfix(Node z){
     79         Node y;
     80         while (z.p.color == false){
     81             if(z.p == z.p.p.left){
     82                 y = z.p.p.right;
     83                 if(y.color == false){   //case 1,both z.p and y(uncle) are red
     84                     z.p.color = true;
     85                     y.color = true;
     86                     z.p.p.color = false;
     87                     z= z.p.p;
     88                     continue;
     89                 }
     90                 else if(z == z.p.right){  //case 2, z.p is red,uncle is black,z is right,transfer to case 3
     91                     z = z.p;
     92                     leftrotation(z);
     93                 }
     94                 z.p.color = true;        //case 3, z.p is red,uncle is black,z is left;
     95                 z.p.p.color = false;
     96                 rightrotation(z.p.p);
     97             }
     98             else{   //set y(uncle) and change rotation
     99                 y = z.p.p.left;
    100                 if(y.color == false){   //case 1,both z.p and y(uncle) are red
    101                     z.p.color = true;
    102                     y.color = true;
    103                     z.p.p.color = false;
    104                     z= z.p.p;
    105                     continue;
    106                 }
    107                 else if(z == z.p.right){  //case 2, z.p is red,uncle is black,z is right,transfer to case 3
    108                     z = z.p;
    109                     rightrotation(z);
    110                 }
    111                 z.p.color = true;        //case 3, z.p is red,uncle is black,z is left;
    112                 z.p.p.color = false;
    113                 leftrotation(z.p.p);
    114             }
    115         }
    116         root.color = true;
    117     }
    118     
    119     private int get(Node x,int key){
    120         if(x == null){
    121             throw new NullPointerException("have't this key");
    122         }
    123         
    124         if(x.key>key){
    125             return get(x.left,key);
    126         }
    127         else if(x.key < key){
    128             return get(x.right,key);
    129         }
    130         else{
    131             return x.val;
    132         }
    133     }
    134     
    135     private void transplant(Node u,Node v){  //substitute u as v
    136         if(u.p == null){
    137             root = v;
    138         }
    139         else if(u == u.p.left){
    140             u.p.left = v;
    141         }
    142         else {
    143             u.p.right = v;
    144         }
    145         v.p = u.p;
    146     }
    147     
    148      private Node deletemin(Node x){
    149          if(x.left == null){return x.right;}
    150          x.left = deletemin(x.left);
    151          return x;
    152          }
    153     
    154     public void delete(int key){
    155         int val = get(root,key);
    156         Node z = new Node(val,key);
    157         Node x;
    158         Node y = z;
    159         boolean original = y.color;
    160         if(z.left == null){
    161             x = z.right;
    162             transplant(z,z.right);
    163         }
    164         else if(z.right == null){
    165             x = z.left;
    166             transplant(z,z.left);
    167         }
    168         else{
    169             y = deletemin(z.right);   // next node after z
    170             original = y.color;
    171             x = y.right;
    172             if(y.p == z){
    173                 x.p = y;
    174             }
    175             else{
    176                 transplant(y,y.right); // put y.right on the original y's position
    177                 y.right = z.right;
    178                 y.right.p = y;
    179             }
    180             transplant(z,y);
    181             y.left = z.left;
    182             y.left.p = y;
    183             y.color = z.color;
    184         }
    185         if(original == true){
    186             deletefix(x);
    187         }
    188     }
    189     
    190     
    191     private void deletefix(Node x) {
    192        Node other;
    193         while ((x.color = true) && (x != root)) {
    194             if (x.p.left == x) {
    195                 other = x.p.right;
    196                 if (other.color == false) {
    197                     // Case 1: x's brother is red 
    198                     other.color = true;
    199                     x.p.color = false;
    200                     leftrotation(x.p);
    201                     other = x.p.right;
    202                 }
    203 
    204                 if ((other.left.color == true) &&
    205                     (other.right.color == true) ){
    206                     // Case 2: x's black is black and w 's both child are black 
    207                     other.color = false;
    208                     x = x.p;
    209                     continue;
    210                 } else if (other.right.color == true) {
    211                         // Case 3: transfer to case 4  
    212                        other.left.color = true;
    213                        other.color = false;
    214                         rightrotation(other);
    215                         other = x.p.right;
    216                     }
    217                     // Case 4:  x's black is black,w's right child is red ,left anyway
    218                  other.color = x.p.color;
    219                    x.p.color = true;
    220                     other.right.color = true;
    221                     leftrotation(x.p);
    222                    x = root;
    223                     break;
    224                 }
    225              else {
    226 
    227                  other = x.p.left;
    228                     if (other.color == false) {
    229                         // Case 1: x's brother is red 
    230                         other.color = true;
    231                         x.p.color = false;
    232                         rightrotation(x.p);
    233                         other = x.p.right;
    234                     }
    235 
    236                     if ((other.left.color == true) &&
    237                         (other.right.color == true) ){
    238                         // Case 2: x's black is black and w 's both child are black 
    239                         other.color = false;
    240                         x = x.p;
    241                         continue;
    242                     } else if (other.right.color == true) {
    243                             // Case 3: transfer to case 4  
    244                            other.left.color = true;
    245                            other.color = false;
    246                             leftrotation(other);
    247                             other = x.p.right;
    248                         }
    249                         // Case 4:  x's black is black,w's right child is red ,left anyway
    250                      other.color = x.p.color;
    251                        x.p.color = true;
    252                         other.right.color = true;
    253                         rightrotation(x.p);
    254                        x = root;
    255                         break;
    256                 }
    257 
    258             }
    259         }
    260 
    261         
    262     
    263     
    264 }
  • 相关阅读:
    MOSS个人站点管理
    WSS3.0开发页面定制(1)修改列表的表单页面
    CodeArt WSS3.0(MOSS)字段编辑权限控制解决方案(v1.0)
    CodeArt WSS3.0(MOSS)字段编辑权限控制解决方案的实现 概要
    编写过滤器WebPart过滤列表内容
    WSS3.0开发过滤列表内容(1)
    给WSS页面添加访问计数器太easy,太cool了
    WSS自定义字段问题:在 RenderPattern 中使用自定义属性
    WSS3.0开发你还在为写CAML痛苦吗?
    MOSS自动备份
  • 原文地址:https://www.cnblogs.com/wujunde/p/6995605.html
Copyright © 2020-2023  润新知