Filip_Markoski

[ADSx] - Grandfather-nephew Relations

Jan 9th, 2018
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.21 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import java.util.ArrayDeque;
  4. import java.util.Queue;
  5. import java.util.StringTokenizer;
  6.  
  7. class BNode<E> {
  8.  
  9.     public E info;
  10.     public BNode<E> left;
  11.     public BNode<E> right;
  12.     char ltag;
  13.     char rtag;
  14.     static int LEFT = 1;
  15.     static int RIGHT = 2;
  16.  
  17.     public BNode(E info) {
  18.         this.info = info;
  19.         left = null;
  20.         right = null;
  21.         ltag = '-';
  22.         rtag = '-';
  23.     }
  24. }
  25.  
  26. class BTree<E> {
  27.  
  28.     public BNode<E> head;
  29.  
  30.     public BTree() {
  31.         head = new BNode<E>(null);
  32.         // po definicija ako nema koren, t.e. ako stebloto e prazno
  33.         head.left = head;
  34.         head.ltag = '-';
  35.         // kaj vodacot sekogas desnata vrska pokazuva kon samiot sebe
  36.         head.right = head;
  37.         head.rtag = '+';
  38.     }
  39.  
  40.     public BNode<E> makeRoot(E elem) {
  41.         BNode<E> tmp = new BNode<E>(elem);
  42.         head.left = tmp;
  43.         head.ltag = '+';
  44.  
  45.         tmp.left = head;
  46.         tmp.ltag = '-';
  47.         tmp.right = head;
  48.         tmp.rtag = '-';
  49.  
  50.         return tmp;
  51.     }
  52.  
  53.     public BNode<E> makeRootNode(BNode<E> tmp) {
  54.         head.left = tmp;
  55.         head.ltag = '+';
  56.  
  57.         tmp.left = head;
  58.         tmp.ltag = '-';
  59.         tmp.right = head;
  60.         tmp.rtag = '-';
  61.  
  62.         return tmp;
  63.     }
  64.  
  65.     public BNode<E> addChildNode(BNode<E> node, int where, BNode<E> tmp) {
  66.  
  67.         if (where == BNode.LEFT) {
  68.  
  69.             if (node.ltag == '+') // veke postoi element
  70.             {
  71.                 return null;
  72.             }
  73.  
  74.             tmp.left = node.left;
  75.             tmp.ltag = '-';
  76.             tmp.right = node;
  77.             tmp.rtag = '-';
  78.             node.left = tmp;
  79.             node.ltag = '+';
  80.         } else {
  81.  
  82.             if (node.rtag == '+') // veke postoi element
  83.             {
  84.                 return null;
  85.             }
  86.  
  87.             tmp.right = node.right;
  88.             tmp.rtag = '-';
  89.             tmp.left = node;
  90.             tmp.ltag = '-';
  91.             node.right = tmp;
  92.             node.rtag = '+';
  93.         }
  94.  
  95.         return tmp;
  96.     }
  97.  
  98.     public void levelOrderQueue(BNode<E> node) {
  99.         Queue<BNode<E>> queue = new ArrayDeque<>();
  100.         int levelNodes = 0;
  101.         if (node == null) return;
  102.         queue.add(node);
  103.         while (!queue.isEmpty()) {
  104.             levelNodes = queue.size();
  105.             while (levelNodes > 0) {
  106.                 BNode<E> poll = queue.poll();
  107.                 System.out.print(" " + poll.info);
  108.                 if (poll.left != null) queue.add(poll.left);
  109.                 if (poll.right != null) queue.add(poll.right);
  110.                 levelNodes--;
  111.             }
  112.             System.out.print(System.lineSeparator());
  113.         }
  114.     }
  115.  
  116.     public void inorderNonRecursive() {
  117.  
  118.         if (head.ltag == '-')      // drvoto e prazno
  119.             return;
  120.  
  121.         System.out.print("INORDER (nonrecursive): ");
  122.  
  123.         BNode<E> p = head.left;
  124.  
  125.         while (p.ltag == '+')
  126.             p = p.left;
  127.  
  128.         while (p != head) {
  129.             System.out.print(p.info.toString() + " ");
  130.             p = successorInorder(p);
  131.         }
  132.         System.out.println();
  133.  
  134.     }
  135.  
  136.     public void inorder() {
  137.         System.out.print("INORDER: ");
  138.  
  139.         if (head.ltag == '+')
  140.             inorderR(head.left);
  141.  
  142.         System.out.println();
  143.     }
  144.  
  145.     void inorderR(BNode<E> n) {
  146.  
  147.         if (n.ltag == '+')
  148.             inorderR(n.left);
  149.  
  150.         System.out.print(n.info.toString() + " ");
  151.  
  152.         if (n.rtag == '+')
  153.             inorderR(n.right);
  154.  
  155.     }
  156.  
  157.     public BNode<E> insertRight(BNode<E> parent, E info) {
  158.  
  159.         BNode<E> child = new BNode<E>(info);
  160.  
  161.         child.ltag = '-';
  162.         child.left = parent;
  163.         child.rtag = parent.rtag;
  164.         child.right = parent.right;
  165.  
  166.         parent.right = child;
  167.         parent.rtag = '+';
  168.  
  169.         if (child.rtag == '+') {
  170.             BNode<E> temp = child.right;
  171.             while (temp.ltag == '+') {
  172.                 temp = temp.left;
  173.             }
  174.             temp.left = child;
  175.         }
  176.  
  177.         return child;
  178.     }
  179.  
  180.     public BNode<E> predecessorInorder(BNode<E> node) {
  181.  
  182.         if (node.ltag == '-') {
  183.             return node.left;
  184.         }
  185.  
  186.         BNode<E> p = node.left;
  187.         while (p.rtag == '+') {
  188.             p = p.right;
  189.         }
  190.  
  191.         return p;
  192.     }
  193.  
  194.     public BNode<E> successorInorder(BNode<E> node) {
  195.  
  196.         if (node.rtag == '-') {
  197.             return node.right;
  198.         }
  199.  
  200.         BNode<E> p = node.right;
  201.         while (p.ltag == '+') {
  202.             p = p.left;
  203.         }
  204.  
  205.         return p;
  206.     }
  207.  
  208.     public int getNumberOfRelations() {
  209.         /**
  210.          * Tags are used as a boolean for existence
  211.          */
  212.         int sum = 0;
  213.         BNode<E> current = head;
  214.         // Go maximally to the left
  215.         while (current.ltag == '+') {
  216.             current = current.left;
  217.         }
  218.         //System.out.println(current.info);
  219.         while (current != head) {
  220.             if (current.ltag == '+') {
  221.                 if (current.left.ltag == '+') {
  222.                     sum++;
  223.                 }
  224.                 if (current.left.rtag == '+') {
  225.                     sum++;
  226.                 }
  227.             }
  228.             if (current.rtag == '+') {
  229.                 if (current.right.ltag == '+') {
  230.                     sum++;
  231.                 }
  232.                 if (current.right.rtag == '+') {
  233.                     sum++;
  234.                 }
  235.             }
  236.             //System.out.println(current.info + " S: " + sum);
  237.             current = successorInorder(current);
  238.         }
  239.         return sum;
  240.     }
  241. }
  242.  
  243. public class Relations {
  244.  
  245.     public static void main(String[] args) throws Exception {
  246.         int i, j, k;
  247.  
  248.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  249.         StringTokenizer st;
  250.  
  251.         int N = Integer.parseInt(br.readLine());
  252.  
  253.         BNode<Integer> nodes[] = new BNode[N];
  254.         BTree<Integer> tree = new BTree<Integer>();
  255.  
  256.         for (i = 0; i < N; i++) {
  257.             nodes[i] = null;
  258.         }
  259.  
  260.         for (i = 0; i < N; i++) {
  261.             String line = br.readLine();
  262.             st = new StringTokenizer(line);
  263.             int index = Integer.parseInt(st.nextToken());
  264.             nodes[index] = new BNode<Integer>(Integer.parseInt(st.nextToken()));
  265.             String action = st.nextToken();
  266.             if (action.equals("LEFT")) {
  267.                 tree.addChildNode(
  268.                         nodes[Integer.parseInt(st.nextToken())],
  269.                         BNode.LEFT,
  270.                         nodes[index]);
  271.             } else if (action.equals("RIGHT")) {
  272.                 tree.addChildNode(nodes[Integer.parseInt(st.nextToken())], BNode.RIGHT, nodes[index]);
  273.             } else {
  274.                 // this node is the root
  275.                 tree.makeRootNode(nodes[index]);
  276.             }
  277.         }
  278.  
  279.         br.close();
  280.  
  281.         System.out.println(tree.getNumberOfRelations());
  282.  
  283.     }
  284. }
  285. /**
  286.  * You are given a binary tree.
  287.  * You need to find the number of grandfather-nephew relations.
  288.  * Grandfather-nephew relations exists,
  289.  * if one of the children of A, is a parent to B.
  290.  * Recursion is not allowed.
  291.  */
Add Comment
Please, Sign In to add comment