Advertisement
Manioc

BST

Jun 29th, 2018
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.50 KB | None | 0 0
  1. package adt.bst;
  2.  
  3. public class BSTImpl<T extends Comparable<T>> implements BST<T> {
  4.  
  5.    protected BSTNode<T> root;
  6.  
  7.    public BSTImpl() {
  8.       root = new BSTNode<T>();
  9.    }
  10.  
  11.    public BSTNode<T> getRoot() {
  12.       return this.root;
  13.    }
  14.  
  15.    @Override
  16.    public boolean isEmpty() {
  17.       return root.isEmpty();
  18.    }
  19.  
  20.    @Override
  21.    public int height() {
  22.       return height(getRoot());
  23.    }
  24.  
  25.    private int height(BSTNode<T> no) {
  26.        int ans = -1;
  27.        if(!no.isEmpty()) {
  28.           ans = Math.max(this.height((BSTNode<T>)no.getLeft()), this.height((BSTNode<T>)no.getRight())) + 1;
  29.        }
  30.        return ans;
  31.    }
  32.  
  33.    @Override
  34.    public BSTNode<T> search(T element) {
  35.       BSTNode<T> ans = new BSTNode<T>();
  36.       if(element != null && !isEmpty()) {
  37.           ans = search(this.root, element);
  38.       }
  39.       return ans;
  40.    }
  41.  
  42.    private BSTNode<T> search(BSTNode<T> no, T element) {
  43.        if(!no.isEmpty()) {
  44.           int igual = no.getData().compareTo(element);
  45.           if(igual == 0) return no;
  46.           if (igual < 0)
  47.              return search((BSTNode<T>) no.getRight(), element);
  48.           if (igual > 0)
  49.              return search((BSTNode<T>) no.getLeft(), element);
  50.       }
  51.       return new BSTNode<T>();
  52.    }
  53.  
  54.    @Override
  55.    public void insert(T element) {
  56.        if(element != null) {
  57.            insert(getRoot(), element);
  58.        }
  59.    }
  60.  
  61.    private void insert(BSTNode<T> no, T element) {
  62.       if (no.isEmpty()) {
  63.         no.setData(element);
  64.         no.setLeft(new BSTNode<T>());
  65.         no.setRight(new BSTNode<T>());
  66.         no.getLeft().setParent(no);
  67.         no.getRight().setParent(no);
  68.      } else {
  69.         if(no.getData().compareTo(element) > 0) {
  70.             this.insert((BSTNode<T>) no.getLeft(), element);
  71.         }else if(no.getData().compareTo(element) < 0) {
  72.             this.insert((BSTNode<T>) no.getRight(), element);
  73.         }
  74.      }
  75.    }
  76.  
  77.    @Override
  78.    public BSTNode<T> maximum() {
  79.        BSTNode<T> ans = null;
  80.        if(!getRoot().isEmpty()) ans = maximum(getRoot());
  81.        return ans;
  82.    }
  83.  
  84.    private BSTNode<T> maximum(BSTNode no) {
  85.       if (no.getRight().isEmpty()) return no;
  86.       return maximum((BSTNode<T>) no.getRight());
  87.    }
  88.  
  89.    @Override
  90.    public BSTNode<T> minimum() {
  91.        BSTNode<T> ans = null;
  92.        if(!isEmpty()) ans = minimum(this.root);
  93.        return ans;
  94.    }
  95.  
  96.    private BSTNode<T> minimum(BSTNode no) {
  97.       if (no.getLeft().isEmpty()) return no;
  98.       return minimum((BSTNode<T>) no.getLeft());
  99.    }
  100.  
  101.    private BSTNode<T> alternativeParent(BSTNode<T> no, T element, boolean tipo){
  102.        BSTNode<T> dad = (BSTNode<T>) no.getParent();
  103.        if((dad == null || dad.getData().compareTo(element) < 0) && !tipo) return dad;
  104.        if((dad == null || dad.getData().compareTo(element) > 0) && tipo) return dad;
  105.        
  106.        return alternativeParent(dad, element, tipo);
  107.    }
  108.    
  109.    @Override
  110.    public BSTNode<T> sucessor(T element) {
  111.       BSTNode<T> ans = null;
  112.       if (element != null) {
  113.          BSTNode<T> no = search(element);
  114.          if(!no.isEmpty()) {
  115.              if (!no.getRight().isEmpty()) {
  116.                 ans = minimum((BSTNode<T>) no.getRight());
  117.             }else {
  118.                 ans = alternativeParent(no, no.getData(), true);
  119.             }
  120.          }
  121.       }
  122.       return ans;
  123.    }
  124.  
  125.    @Override
  126.    public BSTNode<T> predecessor(T element) {
  127.        BSTNode<T> ans = null;
  128.        if (element != null) {
  129.            BSTNode<T> no = search(element);
  130.            if(!no.isEmpty()) {
  131.                if (!no.getLeft().isEmpty()) {
  132.                    ans = maximum((BSTNode<T>) no.getLeft());
  133.                }else {
  134.                    ans = alternativeParent(no, element, false);
  135.                }
  136.            }
  137.        }
  138.        return ans;
  139.    }
  140.    
  141.    @Override
  142.    public void remove(T element) {
  143.       if (element != null) {
  144.          BSTNode<T> no = search(element);
  145.          remove(no);
  146.       }
  147.    }
  148.  
  149.    private void remove(BSTNode<T> no) {
  150.       if(!no.isEmpty()) {
  151.           if(no.isLeaf()) {
  152.               replace(no, new BSTNode());
  153.           }else if(no.getRight().isEmpty()) {
  154.               replace(no,(BSTNode<T>) no.getLeft());
  155.           }else if(no.getLeft().isEmpty()) {     
  156.               replace(no, (BSTNode<T>) no.getRight());
  157.           }else {
  158.               BSTNode<T> sucess = sucessor(no.getData());
  159.               System.out.println(sucess.getData());
  160.               no.setData(sucess.getData());
  161.               remove(sucess);
  162.           }
  163.       }
  164.    }
  165.    
  166.    private void replace(BSTNode<T> no, BSTNode<T> set) {
  167.        BSTNode<T> dad = (BSTNode<T>)no.getParent();
  168.        if(dad == null) {
  169.            this.root = set;
  170.            set.setParent(null);
  171.        }else {
  172.           if(dad.getData().compareTo(no.getData()) <= 0) {
  173.               dad.setRight(set);
  174.               dad.getRight().setParent(dad);
  175.           }else {
  176.               dad.setLeft(set);
  177.               dad.getLeft().setParent(dad);
  178.           }
  179.        }
  180.    }
  181.  
  182.    @Override
  183.    public T[] preOrder() {
  184.       T[] arr = (T[]) new Comparable[this.size()];
  185.       if(!this.isEmpty()) preOrder(this.root, arr, 0);
  186.       return arr;
  187.    }
  188.  
  189.    private int preOrder(BSTNode<T> no, T[] arr, int idx) {
  190.        if(!no.isEmpty()) {
  191.           arr[idx++] = no.getData();
  192.           idx = preOrder((BSTNode<T>) no.getLeft(), arr, idx);
  193.           idx = preOrder((BSTNode<T>) no.getRight(), arr, idx);
  194.        }
  195.        return idx;
  196.    }
  197.  
  198.    @Override
  199.    public T[] order() {
  200.       T[] arr = (T[]) new Comparable[this.size()];
  201.       if(!this.isEmpty())order(getRoot(), arr, 0);
  202.  
  203.       return arr;
  204.    }
  205.  
  206.    private int order(BSTNode<T> no, T[] arr, int idx) {
  207.        if(!no.isEmpty()) {
  208.           idx = order((BSTNode<T>) no.getLeft(), arr, idx);
  209.           arr[idx++] = no.getData();
  210.           idx = order((BSTNode<T>) no.getRight(), arr, idx);
  211.        }
  212.        return idx;
  213.    }
  214.  
  215.    @Override
  216.    public T[] postOrder() {
  217.       T[] arr = (T[]) new Comparable[this.size()];
  218.       if(!this.isEmpty()) postOrder(getRoot(), arr, 0);
  219.  
  220.       return arr;
  221.    }
  222.  
  223.    private int postOrder(BSTNode no, T[] arr, int idx) {
  224.        if(!no.isEmpty()) {
  225.           idx = postOrder((BSTNode<T>) no.getLeft(), arr, idx);
  226.           idx = postOrder((BSTNode<T>) no.getRight(), arr, idx);
  227.           arr[idx++] = (T) no.getData();
  228.        }
  229.        return idx;
  230.    }
  231.  
  232.    /**
  233.     * This method is already implemented using recursion. You must understand
  234.     * how it work and use similar idea with the other methods.
  235.     */
  236.    @Override
  237.    public int size() {
  238.       return size(root);
  239.    }
  240.  
  241.    private int size(BSTNode<T> node) {
  242.       int result = 0;
  243.       // base case means doing nothing (return 0)
  244.       if (!node.isEmpty()) { // indusctive case
  245.          result = 1 + size((BSTNode<T>) node.getLeft()) + size((BSTNode<T>) node.getRight());
  246.       }
  247.       return result;
  248.    }
  249.  
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement