Advertisement
add1ctus

BinarySearchTree

Nov 25th, 2015
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.72 KB | None | 0 0
  1. import java.util.Stack;
  2.  
  3. /*********************** BNode ********************/
  4.  
  5. class BNode <E extends Comparable <E>>
  6. {
  7.     public E info;
  8.     public BNode <E> left;
  9.     public BNode <E> right;
  10.    
  11. public BNode(E info) { //kreira jazol list
  12. this.info = info;
  13. left = null;
  14. right = null;
  15. }
  16. public BNode(E info, BNode<E> left, BNode<E> right) {
  17. this.info = info;
  18. this.left = left;
  19. this.right = right;
  20. }  
  21. }
  22.  
  23. /*********************** BTree ********************/
  24.  
  25. class BSTree <E extends Comparable<E>>
  26. {
  27.     public BNode<E> root;    
  28.     public BSTree()
  29.     {      
  30.         root = null;      
  31.     }
  32.     public BSTree(E info)
  33.     {
  34.         root = new BNode(info);
  35.     }
  36.  
  37. public void inorder() {
  38. System.out.print("INORDER: ");
  39. inorderR(root);
  40. System.out.println();
  41. }
  42. public void inorderR(BNode<E> n) {
  43. if (n != null) {
  44. inorderR(n.left);
  45. System.out.print(n.info.toString()+ " ");
  46. inorderR(n.right);  }
  47. }
  48. public void preorder() {
  49. System.out.print("PREORDER: ");
  50. preorderR(root);
  51. System.out.println();
  52. }
  53. public void preorderR(BNode<E> n) {
  54. if (n != null) {
  55. System.out.print(n.info.toString()+ " ");
  56. preorderR(n.left);
  57. preorderR(n.right);
  58. }    
  59. }
  60. public void postorder() {
  61. System.out.print("POSTORDER: ");
  62. postorderR(root);
  63. System.out.println();
  64. }
  65. public void postorderR(BNode<E> n) {
  66. if (n != null) {
  67. postorderR(n.left);
  68. postorderR(n.right);
  69. System.out.print(n.info.toString()+ " ");
  70. }
  71. }
  72. public void inorderUsingStack(BNode <E> root)
  73. {
  74.    Stack <BNode<E>> s =  new Stack();     // pocnuvame so prazen magacin
  75.    BNode <E> p = root;  
  76.    System.out.print("INORDER using stack:  ");
  77.    while(true)
  78.      { //odime do kraj vo leva nasoka, najleviot element vo drvoto e prv element vo inorder izminuvanje  
  79.         while(p!=null)    
  80.             //vo magacinot ja smestuvame adresata na p, za da znaeme kade da se vratime otkako kje go najdeme najleviot element
  81.             {   s.push(p);  
  82.             p = p.left;  // odi na levoto potsteblo
  83.             }  
  84.         if (s.isEmpty()) break;   //ako sme go ispraznile magacinot togas sme go izminale celo drvo
  85.         //se vadi i pecati informacijata sodrzana vo jazelot na vrvot od magacinot , koj e tekovno najdeniot najlev element
  86.         //i vrvot pokazuva na sledniot jazel vo magacinot, t.e. korenot na prethodno ispechateniot element                            
  87.        p = s.pop();
  88.        System.out.print(p.info.toString()+ " ");    
  89.        /* odi na desnoto potsteblo i povtori ja postapkata ako ima levo potst*/
  90.        p = p.right;
  91.     }
  92.    System.out.println();
  93. }
  94. public void preorderUsingStack(BNode <E> root) //zadacha od lab
  95. {
  96.     Stack <BNode<E>> s = new Stack();
  97.     BNode <E> p=root;
  98.    
  99.     System.out.print("PREORDER using stack:  ");
  100.     while(true)
  101.     {
  102.         while(p!=null)
  103.         {
  104.             if(p.right!=null)
  105.                 s.push(p.right);
  106.             System.out.print(p.info.toString()+" ");
  107.             p=p.left;
  108.         }
  109.                
  110.         if (s.isEmpty()) break;
  111.         p = s.pop();
  112.        
  113.     }
  114.      
  115.     System.out.println();
  116.    
  117. }
  118.    
  119.  
  120. public boolean findR(E x, BNode <E> r)
  121. {
  122.         if(r==null) return false;  //ako drvoto e prazno
  123.         int comp=x.compareTo(r.info);
  124.         if(comp<0)  //jazolot koj go barame se naogja vo levoto poddrvo
  125.         return  findR(x, r.left);
  126.         else if(comp >0)  //jazolot koj go barame se naogja vo desnoto poddrvo
  127.         return  findR(x, r.right);
  128.         else /* (x == r.info) */
  129. return true;
  130. }
  131.  
  132. public boolean isEmpty()
  133. {
  134.     return root==null;
  135. }
  136.  
  137. public BNode <E> findMin(BNode<E> r)
  138. {
  139.     if(r==null) return null; //ako drvoto e prazno
  140.     else if(r.left==null) return r; //ova e najmaliot jazol
  141.     else
  142.         return findMin(r.left);
  143. }
  144.  
  145. public BNode <E> findMax(BNode <E> r)
  146. {
  147.     if(r!=null)
  148.     while(r.right!=null) r=r.right;
  149.     return r;        
  150. }
  151.  
  152.  
  153. public BNode <E> insert(E x, BNode<E> r)
  154. {
  155.         if (r == null) return new BNode(x); //koga kje stigneme do null pozicija, tuka treba da go dodademe jazolot
  156.         int comp=x.compareTo(r.info);
  157.         if (comp < 0)
  158.         {r.left = insert(x, r.left);}  //treba da go dodavame vo levoto podsteblo
  159.         else if (comp > 0)
  160.         {r.right = insert(x, r.right);} //treba da go dodavame vo desnoto podsteblo
  161.         else ; //ne pravi nishto, ne se vmetnuvaat duplikati
  162. return r;
  163. }
  164.  
  165. public BNode <E> insertI(E x, BNode <E> r)
  166. {
  167.       if (r==null)   {  return new BNode(x);  }  //ako drvoto e prazno
  168.       BNode <E> p=r; //pochnuvame da se dvizhime od korenot, i da barame pozicija za vmetnuvanje
  169.       int comp;
  170.       while (p != null)
  171.        {    comp=x.compareTo(p.info);
  172.             if (comp<0) //barame vo levoto poddrvo
  173.              {
  174.                  if (p.left== null) // levo od ovoj jazel treba da se smesti noviot
  175.               {
  176.                    BNode <E> q = new BNode(x);  
  177.                    p.left=q;  
  178.                    break;
  179.                   }
  180.                  else
  181.                      p=p.left;
  182.             }
  183.             else if(comp>0)
  184.             {
  185.                 if (p.right== null) // desno od ovoj jazel treba da se smesti noviot
  186.               {
  187.                    BNode <E> q = new BNode(x);  
  188.                    p.right=q;  
  189.                    break;
  190.                   }
  191.                  else
  192.                      p=p.right;
  193.             }
  194.             else break; //ne smestuvame duplikati                    
  195.     }
  196.       return r;
  197. }
  198.  
  199. public BNode <E> remove (E x, BNode<E> r)
  200. {
  201.     if(r==null) return r; //ako drvoto e prazno ili ne sme go nashle jazolot
  202.     //najprvo treba da go najdeme jazolot, pa potoa kje go brisheme
  203.     int comp=x.compareTo(r.info);
  204.     if(comp<0)    
  205.         r.left=remove(x,r.left);
  206.     else if(comp>0)
  207.         r.right=remove(x, r.right);
  208.     else //go najdovme
  209.     {
  210.         if(r.left!=null && r.right!=null) //jazolot ima dve deca
  211.             //kje go zamenime so najmaliot jazol vo levoto podsteblo
  212.         {
  213.             r.info=findMin(r.right).info;
  214.             r.right=remove(r.info,r.right);
  215.             //potoa go brishime jazolot so koj go zamenivme baraniot
  216.         }
  217.         else  //jazolot ima edno ili nema deca
  218.              if(r.left!=null)
  219.                  return r.left;
  220.              else return r.right;            
  221.     }    
  222.     return r;    
  223. }
  224.  
  225. int numLeaves(BNode <E> r)  /* funkcija koja go vrakja brojot na listovi */
  226. {
  227.     if(r==null) return 0; //ako stigneme do kraj na nekoe poddrvo
  228.     if(r.left==null && r.right==null) //list e
  229.         return 1+numLeaves(r.left)+numLeaves(r.right);
  230.     else
  231.         return numLeaves(r.left)+numLeaves(r.right);    
  232. }
  233.  
  234. int numNodes(BNode <E> r)  /* funkcija koja go vrakja brojot na vnatreshni jazli */
  235. {
  236.     if(r==null) return 0; //ako stigneme do kraj na nekoe poddrvo
  237.     if(r.left==null && r.right==null) //ako stigneme do list
  238.         return 0;
  239.     else
  240.         return 1+numNodes(r.left)+numNodes(r.right);    
  241. }
  242.  
  243. int allNodes(BNode <E> r)  /* funkcija koja go vrakja vkupniot broj na jazli */
  244. {
  245.     if(r==null) return 0;
  246.     return 1+allNodes(r.left)+allNodes(r.right);
  247. }
  248.  
  249. }
  250. public class BinarySearchTree {
  251.  
  252.    
  253.     public static BNode<Integer> makeTreeOfArray(int a[], int l, int r)  
  254.         {
  255.              if(l > r)
  256.                  return null;
  257.              BNode<Integer> result = new BNode<Integer>(a[(l+r)/2]);
  258.              result.left = makeTreeOfArray(a,l,(l+r)/2-1);
  259.              result.right = makeTreeOfArray(a,(l+r)/2+1,r);
  260.              return result;
  261.         }
  262.    
  263.     public static void main(String[] args) {
  264.                        
  265.         BSTree <Integer> tree = new BSTree();
  266.         int array [] = {1, 2, 4, 6, 7, 10, 15};
  267.        
  268.         tree.root = makeTreeOfArray(array,0,array.length-1);
  269.     }
  270. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement