gharizanov92
1/5/2016 - 8:34 PM

Tree.java

package treereview;

// Най-добре е да свикваш да пишеш extends Comparable<? super T> за да нямаш проблеми с наследяването. Ако не ти е ясно защо ще ти дам пример
public class Tree<T extends Comparable<? super T>> {

    private TreeNode<T> root;
    // Не е грешка, но по принцип това не трябва да има getter
    public TreeNode<T> getRoot() {
        return root;
    }
    // и setter
    public void setRoot(TreeNode<T> root) {
        this.root = root;
    }

    public Tree() {
        // Излишно е, защото root е null. Не е грешка.
        root = null;
    }

    public Tree(TreeNode<T> root) {
        this.root = root;
    }

    public boolean isEmpty() {
        return size() == 0;
    }

    /* излишно
    private int size() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    */

    public void insert(T insertObj) {
        if (root == null) {
            root = new TreeNode<T>(insertObj);
        } else {
            root.insertObj(insertObj);
        }
    }
    // Защо T value?
/*    public boolean size(T value) {
        return size(value, root);
    }*/
    public int size() {
        return size(root);
    }

    // size няма как да връща boolean
    // "Колко елемента има дървото? Да."
/*    private boolean size(T value, TreeNode<T> root) {
        // Вярно е, че приключваме като стигнем null. Но трябва да се върне 0, не false.
        if (root == null) {
            return false;
        }

        if (value.equals(root.getData())) {
            return true;
        }

        if (value.compareTo(root.getData()) < 0) {
            return size(value, root.getLeft());
        } else {
            return size(value, root.getRight());
        }

    }*/
    private int size(TreeNode<T> root) {
        // Празното дърво има 0 елемента - или това е дъното
        if (root == null) {
            return 0;
        }

        // Колко елемента има лявото поддърво?
        int leftSubTreeSize = size(root.getLeft());
        // Колко елемента има дясното поддърво?
        int rightSubTreeSize = size(root.getRight());

        // Едно дърво има толкова елемента, колкото имат лявото и дясното поддърво + 1 (корена, от който се разклоняват двете дървета)
        /*
                (*) - 1 елемент
               /  \
      (л. дърво) (дясно поддърво, с rightSubTreeSize елемента)
         */
        return leftSubTreeSize + rightSubTreeSize + 1;
    }
/*

    public void depth(T root) {// nqma predstava dali e taka - не, това нищо не прави, най малкото защото е void. "Колко е дълбочината на дървото? *мълчание*"
        if (root == null) { // това е само дъното. И трябва да
            return;
        }

    }
*/
    public int depth() {
        return depth(root);
    }

    public int depth(TreeNode<T> root) {
        if (root == null) { // празното дърво има дълбочина 0
            return 0;
        }

        // Дълбочината е малко по-сложна от броя елементи. Казваме следното: Имаме дълбочината на лявото и дясното
        // поддърво - съответно N и M. Тогава, ако N е 5, а M е 3 - то ясно е, че дълбочината на дървото е 5, а не 3.
        int leftSubTreeDepth = depth(root.getLeft());
        int rightSubTreeDepth = depth(root.getRight());

        if (leftSubTreeDepth > rightSubTreeDepth) {
            return 1 + leftSubTreeDepth;
        } else {
            return 1 + rightSubTreeDepth;
        }
    }

    public void inOrder() {
        inOrder(root);
        // просто един нов ред, защото използваш print
        System.out.println();
    }

    private void inOrder(TreeNode<T> root) {
        if (root == null) {
            return;
        }
        inOrder(root.getLeft());
        // тук само промених "%d" -> "%d, "
        System.out.printf("%d, ", root.getData());
        inOrder(root.getRight());
    }

    @Override
    public String toString() {
        return "Tree{" + "root=" + root + '}';
    }



}