Я написал следующий код для определения высоты двоичного дерева, это неверно, это не соответствует тестовым случаям, но почему это неправильно, как логически доказать, что это неправильно?
// НЕПРАВИЛЬНЫЙ КОД
public static int height(Node root) {
if(root != null){
if(root.left != null && root.right != null){
return Math.max(height(root.left), height(root.right)) + 1;
}else if(root.left != null){
return height(root.left);
}else{
return height(root.right);
}
}
return 0;
}
Тогда как этот следующий код правильный !!
// ПРАВИЛЬНЫЙ РАБОЧИЙ КОД
public static int height(Node root) {
if(root != null){
if(root.left != null || root.right != null){
return Math.max(height(root.left), height(root.right)) + 1;
}
}
return 0;
}
В чем большая разница между двумя кодами, делающая один из них правильным, а другой неправильным?
Для ясности здесь добавлен код класса для узла.
class Node {
Node left;
Node right;
int data;
Node(int data) {
this.data = data;
left = null;
right = null;
}
}
И это лог c для вставки узла в двоичное дерево.
public static Node insert(Node root, int data) {
if(root == null) {
return new Node(data);
} else {
Node cur;
if(data <= root.data) {
cur = insert(root.left, data);
root.left = cur;
} else {
cur = insert(root.right, data);
root.right = cur;
}
return root;
}