Advertisement
Guest User

Untitled

a guest
May 12th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 11.59 KB | None | 0 0
  1. package zad1;
  2.  
  3. class RBT implements Structure{
  4.      
  5.     /* Class containing left and right child of current node and key value*/
  6.     class Node {
  7.         String key;
  8.         String color="black";
  9.         Node parent= nullNode, left = nullNode, right = nullNode;
  10.  
  11.         public Node(String key, Node parent) {
  12.             this.key = key;
  13.             this.parent = parent;
  14.             this.color="black";
  15.             left = right = null;
  16.         }
  17.         public Node(String key) {
  18.             this.key = key;
  19.         }
  20.     }
  21.  
  22.     // Root of BST
  23.     Node root;
  24.     Node nullNode = new Node(null);
  25.  
  26.     // Constructor
  27.     RBT() {
  28.         root = nullNode;
  29.     }
  30.  
  31.     public Node getRoot(){
  32.         return root;
  33.     }
  34.    
  35.     public void insert(String key) {
  36.         char c = key.charAt(key.length()-1);
  37.         if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
  38.             key=key.substring(0,key.length()-1);
  39.         c = key.charAt(0);
  40.         if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
  41.             key=key.substring(1);
  42.        
  43.         Node node = new Node(key);
  44.         Node temp = root;
  45.         if (root == nullNode) {
  46.             root = node;
  47.             node.color = "black";
  48.             node.parent = nullNode;
  49.         } else {
  50.             node.color = "red";
  51.             while (true) {
  52.                 if (node.key.compareTo(temp.key)<0) {
  53.                     if (temp.left == nullNode) {
  54.                         temp.left = node;
  55.                         node.parent = temp;
  56.                         break;
  57.                     } else {
  58.                         temp = temp.left;
  59.                     }
  60.                 } else if (node.key.compareTo(temp.key)>=0) {
  61.                     if (temp.right == nullNode) {
  62.                         temp.right = node;
  63.                         node.parent = temp;
  64.                         break;
  65.                     } else {
  66.                         temp = temp.right;
  67.                     }
  68.                 }
  69.             }
  70.             fixTree(node);
  71.         }
  72.     }
  73.  
  74.     //Takes as argument the newly inserted node
  75.     private void fixTree(Node node) {
  76.         while (node.parent.color == "red") {
  77.             Node uncle = nullNode;
  78.             if (node.parent == node.parent.parent.left) {
  79.                 uncle = node.parent.parent.right;
  80.  
  81.                 if (uncle != nullNode && uncle.color == "red") {
  82.                     node.parent.color = "black";
  83.                     uncle.color = "black";
  84.                     node.parent.parent.color = "red";
  85.                     node = node.parent.parent;
  86.                     continue;
  87.                 }
  88.                 if (node == node.parent.right) {
  89.                     //Double rotation needed
  90.                     node = node.parent;
  91.                     rotateLeft(node);
  92.                 }
  93.                 node.parent.color = "black";
  94.                 node.parent.parent.color = "red";
  95.                 //if the "else if" code hasn't executed, this
  96.                 //is a case where we only need a single rotation
  97.                 rotateRight(node.parent.parent);
  98.             } else {
  99.                 uncle = node.parent.parent.left;
  100.                  if (uncle != nullNode && uncle.color == "red") {
  101.                     node.parent.color = "black";
  102.                     uncle.color = "black";
  103.                     node.parent.parent.color = "red";
  104.                     node = node.parent.parent;
  105.                     continue;
  106.                 }
  107.                 if (node == node.parent.left) {
  108.                     //Double rotation needed
  109.                     node = node.parent;
  110.                     rotateRight(node);
  111.                 }
  112.                 node.parent.color = "black";
  113.                 node.parent.parent.color = "red";
  114.                 //if the "else if" code hasn't executed, this
  115.                 //is a case where we only need a single rotation
  116.                 rotateLeft(node.parent.parent);
  117.             }
  118.         }
  119.         root.color = "black";
  120.     }
  121.  
  122.     void rotateLeft(Node node) {
  123.         if (node.parent != nullNode) {
  124.             if (node == node.parent.left) {
  125.                 node.parent.left = node.right;
  126.             } else {
  127.                 node.parent.right = node.right;
  128.             }
  129.             node.right.parent = node.parent;
  130.             node.parent = node.right;
  131.             if (node.right.left != nullNode) {
  132.                 node.right.left.parent = node;
  133.             }
  134.             node.right = node.right.left;
  135.             node.parent.left = node;
  136.         } else {//Need to rotate root
  137.             Node right = root.right;
  138.             root.right = right.left;
  139.             right.left.parent = root;
  140.             root.parent = right;
  141.             right.left = root;
  142.             right.parent = nullNode;
  143.             root = right;
  144.         }
  145.     }
  146.  
  147.     void rotateRight(Node node) {
  148.         if (node.parent != nullNode) {
  149.             if (node == node.parent.left) {
  150.                 node.parent.left = node.left;
  151.             } else {
  152.                 node.parent.right = node.left;
  153.             }
  154.  
  155.             node.left.parent = node.parent;
  156.             node.parent = node.left;
  157.             if (node.left.right != nullNode) {
  158.                 node.left.right.parent = node;
  159.             }
  160.             node.left = node.left.right;
  161.             node.parent.right = node;
  162.         } else {//Need to rotate root
  163.             Node left = root.left;
  164.             root.left = root.left.right;
  165.             left.right.parent = root;
  166.             root.parent = left;
  167.             left.right = root;
  168.             left.parent = nullNode;
  169.             root = left;
  170.         }
  171.     }
  172.  
  173.     //usuwanie
  174.     void transplant(Node target, Node with){
  175.         if(target.parent == nullNode){
  176.             root = with;
  177.         }else if(target == target.parent.left){
  178.             target.parent.left = with;
  179.         }else
  180.             target.parent.right = with;
  181.         with.parent = target.parent;
  182.   }
  183.  
  184.   boolean delete(String key){
  185.       Node z;
  186.       if((z = search(root,key))==nullNode) return false;
  187.       Node x;
  188.       Node y = z; // temporary reference y
  189.       String y_original_color = y.color;
  190.      
  191.       if(z.left == nullNode){
  192.           x = z.right;  
  193.           transplant(z, z.right);  
  194.       }else if(z.right == nullNode){
  195.           x = z.left;
  196.           transplant(z, z.left);
  197.       }else{
  198.           y = minValue(z.right);
  199.           y_original_color = y.color;
  200.           x = y.right;
  201.           if(y.parent == z)
  202.               x.parent = y;
  203.           else{
  204.               transplant(y, y.right);
  205.               y.right = z.right;
  206.               y.right.parent = y;
  207.           }
  208.           transplant(z, y);
  209.           y.left = z.left;
  210.           y.left.parent = y;
  211.           y.color = z.color;
  212.       }
  213.       if(y_original_color.equals("black"))
  214.           deleteFixup(x);  
  215.       return true;
  216.   }
  217.  
  218.   void deleteFixup(Node x){
  219.       while(x!=root && x.color == "black"){
  220.           if(x == x.parent.left){
  221.               Node w = x.parent.right;
  222.               if(w.color == "red"){
  223.                   w.color = "black";
  224.                   x.parent.color = "red";
  225.                   rotateLeft(x.parent);
  226.                   w = x.parent.right;
  227.               }
  228.               if(w.left.color == "black" && w.right.color == "black"){
  229.                   w.color = "red";
  230.                   x = x.parent;
  231.                   continue;
  232.               }
  233.               else if(w.right.color == "black"){
  234.                   w.left.color = "black";
  235.                   w.color = "red";
  236.                   rotateRight(w);
  237.                   w = x.parent.right;
  238.               }
  239.               if(w.right.color == "red"){
  240.                   w.color = x.parent.color;
  241.                   x.parent.color = "black";
  242.                   w.right.color = "black";
  243.                   rotateLeft(x.parent);
  244.                   x = root;
  245.               }
  246.           }else{
  247.               Node w = x.parent.left;
  248.               if(w.color == "red"){
  249.                   w.color = "black";
  250.                   x.parent.color = "red";
  251.                   rotateRight(x.parent);
  252.                   w = x.parent.left;
  253.               }
  254.               if(w.right.color == "black" && w.left.color == "black"){
  255.                   w.color = "red";
  256.                   x = x.parent;
  257.                   continue;
  258.               }
  259.               else if(w.left.color == "black"){
  260.                   w.right.color = "black";
  261.                   w.color = "red";
  262.                   rotateLeft(w);
  263.                   w = x.parent.left;
  264.               }
  265.               if(w.left.color == "red"){
  266.                   w.color = x.parent.color;
  267.                   x.parent.color = "black";
  268.                   w.left.color = "black";
  269.                   rotateRight(x.parent);
  270.                   x = root;
  271.               }
  272.           }
  273.       }
  274.       x.color = "black";
  275.   }
  276.     //max
  277.     public void max(Node root){
  278.         Node n = maxValue(root);
  279.         if(n==nullNode)
  280.             System.out.println();
  281.         else
  282.             System.out.println(n.key);
  283.     }
  284.     public Node maxValue(Node root) {
  285.         if(root==nullNode){
  286.             return root;
  287.         }
  288.         else if(root.right==nullNode){
  289.             return root;
  290.         }
  291.         else
  292.             return maxValue(root.right);
  293.     }
  294.     //min
  295.     public void min(Node root){
  296.         Node n = minValue(root);
  297.         if(n==nullNode)
  298.             System.out.println();
  299.         else
  300.             System.out.println(n.key);
  301.     }
  302.     public Node minValue(Node root) {
  303.         if(root==nullNode){
  304.             return root;
  305.         }
  306.         else if(root.left==nullNode){
  307.             return root;
  308.         }
  309.         else
  310.             return minValue(root.left);
  311.     }
  312.    
  313.     // This method mainly calls InorderRec()
  314.     void inorder()  {
  315.        inorderRec(root);
  316.        System.out.print("\n");
  317.     }
  318.  
  319.     // A utility function to do inorder traversal of BST
  320.     void inorderRec(Node root) {
  321.         if (root != nullNode) {
  322.             inorderRec(root.left);
  323.             if(root.parent==nullNode)
  324.                 System.out.print(root.key+"["+root.color+"] ");
  325.             else
  326.                 System.out.print(root.key+"["+root.color+"] ");
  327.             inorderRec(root.right);
  328.         }
  329.     }
  330.     //szukanie
  331.     public Node search(Node root, String key)
  332.     {
  333.         // Base Cases: root is null or key is present at root
  334.         if(root==nullNode||root.key.equals(key))
  335.             return root;
  336.  
  337.         if (key.compareTo(root.key)<0)
  338.             return search(root.left, key);
  339.        
  340.         return search(root.right, key);
  341.     }
  342.    
  343.     public void find(String key){
  344.         if(search(this.getRoot(),key)==nullNode)
  345.             System.out.println("0");
  346.         else
  347.             System.out.println("1");
  348.     }
  349.   //succesor
  350.     public void successor(String key){
  351.         Node n = search(this.getRoot(),key);
  352.         if(n==nullNode)
  353.             System.out.println();
  354.         else{
  355.             if(n.right==nullNode){
  356.                 Node p = n.parent;
  357.                 if(p==nullNode)
  358.                     System.out.println();
  359.                 else if(p.left==n)
  360.                     System.out.println(p.key);
  361.                 else if(p.parent==nullNode)
  362.                     System.out.println();
  363.                 else
  364.                     System.out.println(p.parent.key);
  365.             }
  366.             else
  367.                 min(n.right);
  368.         }
  369.     }
  370.     // Driver Program to test above functions
  371.     public static void main(String[] args) {
  372.         RBT tree = new RBT();
  373.  
  374.         tree.insert("1S1");
  375.         tree.insert("b");
  376.         tree.insert("c>");
  377.         tree.insert("dwa");
  378.         tree.insert("AL");
  379.         tree.insert("1A");
  380.         tree.insert("D");
  381.  
  382.         tree.inorder();
  383.         tree.find("dwa");
  384.         tree.successor("D");
  385.         tree.max(tree.getRoot());
  386.         tree.delete("dwa");
  387.         tree.max(tree.getRoot());
  388.     }
  389. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement