evitanasevska

Нерекурзивно изминување во preorder

Dec 10th, 2016
553
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.89 KB | None | 0 0
  1. /*
  2. Нерекурзивно изминување во preorder Problem 2 (1 / 1)
  3. Да се напише функција preorderNonRecursive за нерекурзивно изминување на бинарно стебло во preorder.
  4.  
  5. Име на класата: PreorderNonRecursive
  6.  
  7. Sample input
  8. 8
  9. 0 A ROOT
  10. 1 B LEFT 0
  11. 2 C LEFT 1
  12. 3 D RIGHT 1
  13. 4 E RIGHT 0
  14. 5 F RIGHT 4
  15. 6 G LEFT 5
  16. 7 H RIGHT 5
  17. Sample output
  18. A B C D E F G H
  19. */
  20. import java.io.BufferedReader;
  21. import java.io.InputStreamReader;
  22. import java.util.StringTokenizer;
  23. import java.util.NoSuchElementException;
  24.  
  25. class BNode<E> {
  26.    
  27.     public E info;
  28.     public BNode<E> left;
  29.     public BNode<E> right;
  30.    
  31.     static int LEFT = 1;
  32.     static int RIGHT = 2;
  33.    
  34.     public BNode(E info) {
  35.         this.info = info;
  36.         left = null;
  37.         right = null;
  38.     }
  39.    
  40.     public BNode() {
  41.         this.info = null;
  42.         left = null;
  43.         right = null;
  44.     }
  45.    
  46.     public BNode(E info, BNode<E> left, BNode<E> right) {
  47.         this.info = info;
  48.         this.left = left;
  49.         this.right = right;
  50.     }
  51.    
  52. }
  53.  
  54. class BTree<E> {
  55.    
  56.     public BNode<E> root;
  57.    
  58.     public BTree() {
  59.         root = null;
  60.     }
  61.    
  62.     public BTree(E info) {
  63.         root = new BNode<E>(info);
  64.     }
  65.    
  66.     public void makeRoot(E elem) {
  67.         root = new BNode(elem);
  68.     }
  69.    
  70.     public void makeRootNode(BNode<E> node) {
  71.         root = node;
  72.     }
  73.    
  74.     public BNode<E> addChild(BNode<E> node, int where, E elem) {
  75.        
  76.         BNode<E> tmp = new BNode<E>(elem);
  77.        
  78.         if (where == BNode.LEFT) {
  79.             if (node.left != null)  // veke postoi element
  80.                 return null;
  81.             node.left = tmp;
  82.         } else {
  83.             if (node.right != null) // veke postoi element
  84.                 return null;
  85.             node.right = tmp;
  86.         }
  87.        
  88.         return tmp;
  89.     }
  90.    
  91.     public BNode<E> addChildNode(BNode<E> node, int where, BNode<E> tmp) {
  92.        
  93.         if (where == BNode.LEFT) {
  94.             if (node.left != null)  // veke postoi element
  95.                 return null;
  96.             node.left = tmp;
  97.         } else {
  98.             if (node.right != null) // veke postoi element
  99.                 return null;
  100.             node.right = tmp;
  101.         }
  102.        
  103.         return tmp;
  104.     }
  105.    
  106.     public void PreorderNonRecursive() {
  107.         ArrayStack<BNode<E>> s = new ArrayStack<BNode<E>>(100);
  108.         BNode<E> pom = root;
  109.         while (true) {
  110.             while (pom != null) {
  111.                 s.push(pom);
  112.                 System.out.print(pom.info.toString()+" ");
  113.                 pom = pom.left;
  114.             }  
  115.            
  116.             if (s.isEmpty())
  117.                 break;
  118.            
  119.             pom = s.peek();
  120.             s.pop();
  121.             pom = pom.right;
  122.            
  123.         }
  124.         System.out.println();
  125.     }
  126.    
  127. }
  128.  
  129. interface Stack<E> {
  130.  
  131.     // Elementi na stekot se objekti od proizvolen tip.
  132.  
  133.     // Metodi za pristap:
  134.  
  135.     public boolean isEmpty ();
  136.         // Vrakja true ako i samo ako stekot e prazen.
  137.  
  138.     public E peek ();
  139.         // Go vrakja elementot na vrvot od stekot.
  140.  
  141.     // Metodi za transformacija:
  142.  
  143.     public void clear ();
  144.         // Go prazni stekot.
  145.  
  146.     public void push (E x);
  147.         // Go dodava x na vrvot na stekot.
  148.  
  149.     public E pop ();
  150.         // Go otstranuva i vrakja elementot shto e na vrvot na stekot.
  151. }
  152.  
  153. class ArrayStack<E> implements Stack<E> {
  154.     private E[] elems;
  155.     private int depth;
  156.  
  157.     @SuppressWarnings("unchecked")
  158.     public ArrayStack (int maxDepth) {
  159.         // Konstrukcija na nov, prazen stek.
  160.         elems = (E[]) new Object[maxDepth];
  161.         depth = 0;
  162.     }
  163.  
  164.  
  165.     public boolean isEmpty () {
  166.         // Vrakja true ako i samo ako stekot e prazen.
  167.         return (depth == 0);
  168.     }
  169.  
  170.  
  171.     public E peek () {
  172.         // Go vrakja elementot na vrvot od stekot.
  173.         if (depth == 0)
  174.             throw new NoSuchElementException();
  175.         return elems[depth-1];
  176.     }
  177.  
  178.  
  179.     public void clear () {
  180.         // Go prazni stekot.
  181.         for (int i = 0; i < depth; i++)  elems[i] = null;
  182.         depth = 0;
  183.     }
  184.  
  185.  
  186.     public void push (E x) {
  187.         // Go dodava x na vrvot na stekot.
  188.         elems[depth++] = x;
  189.     }
  190.  
  191.  
  192.     public E pop () {
  193.         // Go otstranuva i vrakja elementot shto e na vrvot na stekot.
  194.         if (depth == 0)
  195.             throw new NoSuchElementException();
  196.         E topmost = elems[--depth];
  197.         elems[depth] = null;
  198.         return topmost;
  199.     }
  200. }
  201.  
  202. public class PreorderNonRecursive {
  203.  
  204.     public static void main(String[] args) throws Exception {
  205.         int i, j, k;
  206.         int index;
  207.         String action;
  208.        
  209.         String line;
  210.  
  211.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  212.         StringTokenizer st;
  213.  
  214.         int N = Integer.parseInt(br.readLine());
  215.  
  216.         BNode<String> nodes[] = new BNode[N];
  217.         BTree<String> tree = new BTree<String>();
  218.        
  219.         for (i=0;i<N;i++)
  220.             nodes[i] = new BNode<String>();
  221.        
  222.         for (i = 0; i < N; i++) {
  223.             line = br.readLine();
  224.             st = new StringTokenizer(line);
  225.             index = Integer.parseInt(st.nextToken());
  226.             nodes[index].info = st.nextToken();
  227.             action = st.nextToken();
  228.             if (action.equals("LEFT")) {
  229.                 tree.addChildNode(nodes[Integer.parseInt(st.nextToken())], BNode.LEFT, nodes[index]);
  230.             } else if (action.equals("RIGHT")) {
  231.                 tree.addChildNode(nodes[Integer.parseInt(st.nextToken())], BNode.RIGHT, nodes[index]);    
  232.             } else {
  233.                 // this node is the root
  234.                 tree.makeRootNode(nodes[index]);
  235.             }
  236.         }
  237.  
  238.         br.close();
  239.        
  240.         tree.PreorderNonRecursive();
  241.        
  242.     }
  243. }
Advertisement
Add Comment
Please, Sign In to add comment