prometheus800

Збир на елементи во бинарно дрво (итеративно решение) АПС

Dec 30th, 2020
840
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.40 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import java.util.LinkedList;
  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.  
  13.     static int LEFT = 1;
  14.     static int RIGHT = 2;
  15.  
  16.     public BNode(E info) {
  17.         this.info = info;
  18.         left = null;
  19.         right = null;
  20.     }
  21.  
  22.     public BNode() {
  23.         this.info = null;
  24.         left = null;
  25.         right = null;
  26.     }
  27.  
  28.     public BNode(E info, BNode<E> left, BNode<E> right) {
  29.         this.info = info;
  30.         this.left = left;
  31.         this.right = right;
  32.     }
  33.  
  34. }
  35.  
  36. class BTree<E extends Comparable<E>> {
  37.  
  38.     public BNode<E> root;
  39.  
  40.     public BTree() {
  41.         root = null;
  42.     }
  43.  
  44.     public BTree(E info) {
  45.         root = new BNode<E>(info);
  46.     }
  47.  
  48.     public void makeRoot(E elem) {
  49.         root = new BNode(elem);
  50.     }
  51.  
  52.     public void makeRootNode(BNode<E> node) {
  53.         root = node;
  54.     }
  55.  
  56.     public BNode<E> addChild(BNode<E> node, int where, E elem) {
  57.  
  58.         BNode<E> tmp = new BNode<E>(elem);
  59.  
  60.         if (where == BNode.LEFT) {
  61.             if (node.left != null)  // veke postoi element
  62.                 return null;
  63.             node.left = tmp;
  64.         } else {
  65.             if (node.right != null) // veke postoi element
  66.                 return null;
  67.             node.right = tmp;
  68.         }
  69.  
  70.         return tmp;
  71.     }
  72.  
  73.     public BNode<E> addChildNode(BNode<E> node, int where, BNode<E> tmp) {
  74.  
  75.         if (where == BNode.LEFT) {
  76.             if (node.left != null)  // veke postoi element
  77.                 return null;
  78.             node.left = tmp;
  79.         } else {
  80.             if (node.right != null) // veke postoi element
  81.                 return null;
  82.             node.right = tmp;
  83.         }
  84.  
  85.         return tmp;
  86.     }
  87.  
  88. }
  89.  
  90. public class BinaryTreeSum {
  91.  
  92.     private static BNode<Integer> getStartingNode(int baranaVrednost, Queue<BNode<Integer>> treeQueue) {
  93.         BNode<Integer> theChosenOne = new BNode<>();
  94.  
  95.         while(treeQueue.size() > 0){
  96.             BNode<Integer> node = treeQueue.peek();
  97.  
  98.             if(node.info == baranaVrednost){
  99.                 theChosenOne = node;
  100.                 break;
  101.             }
  102.  
  103.             treeQueue.remove();
  104.             if(node.left != null)
  105.                 treeQueue.add(node.left);
  106.             if(node.right != null)
  107.                 treeQueue.add(node.right);
  108.         }
  109.         treeQueue.clear(); //clear queue in case theChosenOne was found before the queue was emptied
  110.         return theChosenOne;
  111.     }
  112.  
  113.     private static int getSumFromTree(BNode<Integer> startingNode, BNode<Integer> parentNode, Queue<BNode<Integer>> treeQueue, boolean type){
  114.         treeQueue.add(startingNode);
  115.  
  116.         int sum = 0;
  117.  
  118.         while(!treeQueue.isEmpty() && startingNode != null){
  119.             startingNode = treeQueue.poll();
  120.  
  121.             if(startingNode.left != null){
  122.                 treeQueue.add(startingNode.left);
  123.             }
  124.             if(startingNode.right != null){
  125.                 treeQueue.add(startingNode.right);
  126.             }
  127.             //If type == true, sum all nodes.info that are smaller than parentNode.info, else..
  128.             if(type){
  129.                 if(startingNode.info < parentNode.info)
  130.                     sum += startingNode.info;
  131.             }
  132.             else {
  133.                 if(startingNode.info > parentNode.info)
  134.                     sum += startingNode.info;
  135.             }
  136.         }
  137.         return sum;
  138.     }
  139.  
  140.  
  141.     public static void main(String[] args) throws Exception {
  142.         int i, j, k;
  143.         int index;
  144.         String action;
  145.  
  146.         String line;
  147.  
  148.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  149.         StringTokenizer st;
  150.  
  151.         int N = Integer.parseInt(br.readLine());
  152.  
  153.         BNode<Integer> nodes[] = new BNode[N];
  154.         BTree<Integer> tree = new BTree<Integer>();
  155.  
  156.         for (i=0;i<N;i++)
  157.             nodes[i] = new BNode<Integer>();
  158.  
  159.         for (i = 0; i < N; i++) {
  160.             line = br.readLine();
  161.             st = new StringTokenizer(line);
  162.             index = Integer.parseInt(st.nextToken());
  163.             nodes[index].info = Integer.parseInt(st.nextToken());
  164.             action = st.nextToken();
  165.             if (action.equals("LEFT")) {
  166.                 tree.addChildNode(nodes[Integer.parseInt(st.nextToken())], BNode.LEFT, nodes[index]);
  167.             } else if (action.equals("RIGHT")) {
  168.                 tree.addChildNode(nodes[Integer.parseInt(st.nextToken())], BNode.RIGHT, nodes[index]);
  169.             } else {
  170.                 // this node is the root
  171.                 tree.makeRootNode(nodes[index]);
  172.             }
  173.         }
  174.  
  175.         int baranaVrednost=Integer.parseInt(br.readLine());
  176.  
  177.         br.close();
  178.  
  179.         // vasiot kod ovde
  180.        
  181.         BNode<Integer> current = tree.root;
  182.         Queue<BNode<Integer>> treeQueue = new LinkedList<>();
  183.         treeQueue.add(current);
  184.  
  185.         BNode<Integer> parentNode = getStartingNode(baranaVrednost, treeQueue);
  186.  
  187.         BNode<Integer> leftTree = parentNode.left;
  188.         int leftTreeSum = getSumFromTree(leftTree, parentNode, treeQueue, true);
  189.  
  190.         BNode<Integer> rightTree = parentNode.right;
  191.         int rightTreeSum = getSumFromTree(rightTree, parentNode, treeQueue, false);
  192.  
  193.         System.out.println(leftTreeSum + " " + rightTreeSum);
  194.     }
  195. }
Add Comment
Please, Sign In to add comment