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 + '}';
}
}