Advertisement
Kame3

Дедо-внук релации - [дрво]

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