Advertisement
Guest User

Untitled

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