Advertisement
dargenn

Untitled

Nov 17th, 2015
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.23 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.ArrayList;
  3. import java.util.Scanner;
  4.  
  5. class RBT {
  6.  
  7.     private final int RED = 0;
  8.     private final int BLACK = 1;
  9.  
  10.     private class Node {
  11.         String key = "";
  12.         String translations;
  13.         int color = BLACK;
  14.         Node left = nil;
  15.         Node right = nil;
  16.         Node parent = nil;
  17.  
  18.         Node(String key, String translations) {
  19.             this.key = key;
  20.             this.translations = translations;
  21.         }
  22.     }
  23.  
  24.     private final Node nil = new Node("", null);
  25.     private Node root = nil;
  26.  
  27.     public void printTree(Node node) {
  28.         if (node == nil)
  29.             return;
  30.  
  31.         printTree(node.left);
  32.  
  33.         if (node.color == RED)
  34.             System.out.print("Red " + node.key + " Parent: " + node.parent.key + "\n");
  35.         else
  36.             System.out.print("Black " + node.key + " Parent: " + node.parent.key + "\n");
  37.  
  38.         printTree(node.right);
  39.     }
  40.  
  41.     public void printTree(Node node, PrintWriter fileOut) {
  42.         if (node == nil)
  43.             return;
  44.  
  45.         printTree(node.left, fileOut);
  46.  
  47.         fileOut.print(node.key + " ");
  48.         fileOut.print(node.translations);
  49.         fileOut.println();
  50.  
  51.         printTree(node.right, fileOut);
  52.     }
  53.  
  54.     public void printTreeBinary(Node node, FileOutputStream file) throws IOException{
  55.  
  56.         if(node == nil)
  57.             return;
  58.  
  59.         printTreeBinary(node.left, file);
  60.  
  61.         String result = "";
  62.         result += node.translations.length();
  63.         result +=  node.translations;
  64.  
  65.         String bytes = node.key.length()+node.key+result;
  66.         byte[] buffer = bytes.getBytes();
  67.         file.write(buffer);
  68.  
  69.         printTreeBinary(node.right, file);
  70.     }
  71.  
  72.     private Node findNode(Node findNode, Node node) {
  73.         if (root.key.equals(nil))
  74.             return null;
  75.  
  76.         if (findNode.key.compareTo(node.key) < 0) {
  77.             if (node.left != nil)
  78.                 return findNode(findNode, node.left);
  79.         } else if (findNode.key.compareTo(node.key) > 0) {
  80.             if (node.right != nil)
  81.                 return findNode(findNode, node.right);
  82.         } else if (findNode.key.equals(node.key)) {
  83.             return node;
  84.         }
  85.  
  86.         return null;
  87.     }
  88.  
  89.     private void insert(Node node) {
  90.         Node temp = root;
  91.  
  92.         if (root == nil) {
  93.             root = node;
  94.             node.color = BLACK;
  95.             node.parent = nil;
  96.         } else {
  97.             node.color = RED;
  98.             while (true) {
  99.                 if (node.key.compareTo(temp.key) < 0) {
  100.                     if (temp.left == nil) {
  101.                         temp.left = node;
  102.                         node.parent = temp;
  103.                         break;
  104.                     } else {
  105.                         temp = temp.left;
  106.                     }
  107.                 } else if (node.key.compareTo(temp.key) >= 0) {
  108.                     if (temp.right == nil) {
  109.                         temp.right = node;
  110.                         node.parent = temp;
  111.                         break;
  112.                     } else
  113.                         temp = temp.right;
  114.                 }
  115.             }
  116.             fixTree(node);
  117.         }
  118.     }
  119.  
  120.     private void fixTree(Node node) {
  121.         while (node.parent.color == RED) {
  122.             Node uncle = nil;
  123.             if (node.parent == node.parent.parent.left) {
  124.                 uncle = node.parent.parent.right;
  125.  
  126.                 if (uncle != nil && uncle.color == RED) {
  127.                     node.parent.color = BLACK;
  128.                     uncle.color = BLACK;
  129.                     node.parent.parent.color = RED;
  130.                     node = node.parent.parent;
  131.                     continue;
  132.                 }
  133.  
  134.                 if (node == node.parent.right) {
  135.                     node = node.parent;
  136.                     leftRotate(node);
  137.                 }
  138.  
  139.                 node.parent.color = BLACK;
  140.                 node.parent.parent.color = RED;
  141.  
  142.                 rightRotate(node.parent.parent);
  143.             } else {
  144.                 uncle = node.parent.parent.left;
  145.  
  146.                 if (uncle != nil && uncle.color == RED) {
  147.                     node.parent.color = BLACK;
  148.                     uncle.color = BLACK;
  149.                     node.parent.parent.color = RED;
  150.                     node = node.parent.parent;
  151.                     continue;
  152.                 }
  153.  
  154.                 if (node == node.parent.left) {
  155.                     node = node.parent;
  156.                     rightRotate(node);
  157.                 }
  158.  
  159.                 node.parent.color = BLACK;
  160.                 node.parent.parent.color = RED;
  161.  
  162.                 leftRotate(node.parent.parent);
  163.             }
  164.         }
  165.         root.color = BLACK;
  166.     }
  167.  
  168.     void leftRotate(Node node) {
  169.         if (node.parent != nil) {
  170.             if (node == node.parent.left)
  171.                 node.parent.left = node.right;
  172.             else
  173.                 node.parent.right = node.right;
  174.  
  175.             node.right.parent = node.parent;
  176.             node.parent = node.right;
  177.  
  178.             if (node.right.left != nil)
  179.                 node.right.left.parent = node;
  180.  
  181.             node.right = node.right.left;
  182.             node.parent.left = node;
  183.         } else {
  184.             Node right = root.right;
  185.             root.right = right.left;
  186.             right.left.parent = root;
  187.             root.parent = right;
  188.             right.left = root;
  189.             right.parent = nil;
  190.             root = right;
  191.         }
  192.     }
  193.  
  194.     void rightRotate(Node node) {
  195.         if (node.parent != nil) {
  196.             if (node == node.parent.left)
  197.                 node.parent.left = node.left;
  198.             else
  199.                 node.parent.right = node.left;
  200.  
  201.             node.left.parent = node.parent;
  202.             node.parent = node.left;
  203.  
  204.             if (node.left.right != nil)
  205.                 node.left.right.parent = node;
  206.  
  207.             node.left = node.left.right;
  208.             node.parent.right = node;
  209.         } else {
  210.             Node left = root.left;
  211.             root.left = root.left.right;
  212.             left.right.parent = root;
  213.             root.parent = left;
  214.             left.right = root;
  215.             left.parent = nil;
  216.             root = left;
  217.         }
  218.     }
  219.  
  220.     void changeNodes(Node target, Node with){
  221.         if(target.parent == nil)
  222.             root = with;
  223.         else if(target == target.parent.left)
  224.             target.parent.left = with;
  225.         else
  226.             target.parent.right = with;
  227.  
  228.         with.parent = target.parent;
  229.     }
  230.  
  231.     boolean delete(Node z){
  232.         if( (z = findNode(z, root)) == null)
  233.             return false;
  234.  
  235.         Node x;
  236.         Node y = z;
  237.         int y_original_color = y.color;
  238.  
  239.         if(z.left == nil){
  240.             x = z.right;
  241.             changeNodes(z, z.right);
  242.         }else if(z.right == nil){
  243.             x = z.left;
  244.             changeNodes(z, z.left);
  245.         }else{
  246.             y = treeMinimum(z.right);
  247.             y_original_color = y.color;
  248.             x = y.right;
  249.             if(y.parent == z)
  250.                 x.parent = y;
  251.             else{
  252.                 changeNodes(y, y.right);
  253.                 y.right = z.right;
  254.                 y.right.parent = y;
  255.             }
  256.             changeNodes(z, y);
  257.             y.left = z.left;
  258.             y.left.parent = y;
  259.             y.color = z.color;
  260.         }
  261.         if(y_original_color == BLACK)
  262.             deleteFixUp(x);
  263.         return true;
  264.     }
  265.  
  266.     void deleteFixUp(Node x){
  267.         while(x!=root && x.color == BLACK){
  268.             if(x == x.parent.left){
  269.                 Node w = x.parent.right;
  270.                 if(w.color == RED){
  271.                     w.color = BLACK;
  272.                     x.parent.color = RED;
  273.                     leftRotate(x.parent);
  274.                     w = x.parent.right;
  275.                 }
  276.                 if(w.left.color == BLACK && w.right.color == BLACK){
  277.                     w.color = RED;
  278.                     x = x.parent;
  279.                     continue;
  280.                 }
  281.                 else if(w.right.color == BLACK){
  282.                     w.left.color = BLACK;
  283.                     w.color = RED;
  284.                     rightRotate(w);
  285.                     w = x.parent.right;
  286.                 }
  287.                 if(w.right.color == RED){
  288.                     w.color = x.parent.color;
  289.                     x.parent.color = BLACK;
  290.                     w.right.color = BLACK;
  291.                     leftRotate(x.parent);
  292.                     x = root;
  293.                 }
  294.             }else{
  295.                 Node w = x.parent.left;
  296.                 if(w.color == RED){
  297.                     w.color = BLACK;
  298.                     x.parent.color = RED;
  299.                     rightRotate(x.parent);
  300.                     w = x.parent.left;
  301.                 }
  302.                 if(w.right.color == BLACK && w.left.color == BLACK){
  303.                     w.color = RED;
  304.                     x = x.parent;
  305.                     continue;
  306.                 }
  307.                 else if(w.left.color == BLACK){
  308.                     w.right.color = BLACK;
  309.                     w.color = RED;
  310.                     leftRotate(w);
  311.                     w = x.parent.left;
  312.                 }
  313.                 if(w.left.color == RED){
  314.                     w.color = x.parent.color;
  315.                     x.parent.color = BLACK;
  316.                     w.left.color = BLACK;
  317.                     rightRotate(x.parent);
  318.                     x = root;
  319.                 }
  320.             }
  321.         }
  322.         x.color = BLACK;
  323.     }
  324.  
  325.     Node treeMinimum(Node node){
  326.         while(node.left != nil)
  327.             node = node.left;
  328.         return node;
  329.     }
  330.  
  331.     public void functionality() throws IOException{
  332.         Scanner fileIn = new Scanner (new FileReader("plikwejsciowy.txt"));
  333.         PrintWriter fileOut = new PrintWriter("plikwyjsciowy.txt");
  334.         Scanner scanner = new Scanner(System.in);
  335.         Scanner scanLines = new Scanner(System.in);
  336.         FileInputStream inputStream = new FileInputStream("andrzej.dat");
  337.  
  338.  
  339.         String item, line, word;
  340.         Node node;
  341.         int choice;
  342.         boolean ifTrue = true;
  343.  
  344.         while(fileIn.hasNext()){
  345.             line = fileIn.nextLine();
  346.             String[] split = line.split(" ");
  347.             item = split[0];
  348.             String stringArray = "";
  349.             for(int i = 1; i < split.length; i++)
  350.                 stringArray += split[i] + " ";
  351.  
  352.             node = new Node(item, stringArray);
  353.             insert(node);
  354.         }
  355.  
  356.         printTree(root);
  357.  
  358.         menu();
  359.         while(ifTrue == true) {
  360.             choice = scanner.nextInt();
  361.             switch (choice) {
  362.                 case 1:
  363.                     word = scanner.next();
  364.                     node = new Node(word, null);
  365.  
  366.                     if (findNode(node, root) != null) {
  367.                         System.out.println("Word " + node.key + " found! Here are translations:");
  368.                         node = findNode(node, root);
  369.                         System.out.println(node.translations);
  370.                     }
  371.                     else
  372.                         System.out.println("Sorry, word " + node.key + " not found!");
  373.                     break;
  374.  
  375.                 case 2:
  376.                     word = scanner.next();
  377.                     node = new Node(word, null);
  378.                     System.out.print("\nDeleting item " + word);
  379.  
  380.                     if (delete(node))
  381.                         System.out.println(": deleted!\n\n");
  382.                     else
  383.                         System.out.println(": does not exist!\n\n");
  384.  
  385.                     printTree(root);
  386.                     break;
  387.  
  388.                 case 3:
  389.                     word = scanLines.nextLine();
  390.                     String[] split = word.split(" ");
  391.                     String tempList = "";
  392.  
  393.                     for(int i = 1; i < split.length; i++)
  394.                         tempList += split[i] + " ";
  395.  
  396.                     node = new Node(split[0], tempList);
  397.                     insert(node);
  398.  
  399.                     printTree(root);
  400.                     break;
  401.  
  402.                 case 4:
  403.                     printTree(root, fileOut);
  404.                     break;
  405.  
  406.                 case 5:
  407.                     FileOutputStream outputStream = new FileOutputStream("andrzej.dat");
  408.                     printTreeBinary(root, outputStream);
  409.                     outputStream.close();
  410.                     break;
  411.  
  412.                 case 7:
  413.                     printTree(root);
  414.                     break;
  415.  
  416.                 default:
  417.                     ifTrue = false;
  418.                     break;
  419.             }
  420.         }
  421.  
  422.         fileIn.close();
  423.         fileOut.close();
  424.     }
  425.  
  426.     public static void menu(){
  427.         System.out.println("\n1 - Find word with translations\n"
  428.                 + "2 - Delete word\n"
  429.                 + "3 - Insert word with translations (in one line)\n"
  430.                 + "4 - Save dictionary to a file\n"
  431.                 + "5 - Save dictionary to a binary file\n"
  432.                 + "6 - Read from binary file\n"
  433.                 + "7 - Print tree\n"
  434.                 + "Any other to quit\n");
  435.     }
  436.  
  437.     public static void main(String[] args) throws IOException{
  438.         RBT dictionary_rbt = new RBT();
  439.         dictionary_rbt.functionality();
  440.     }
  441. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement