OK, переходим шаг за шагом. Прежде всего, я сосредоточусь на самом алгоритме.
class Node<T> {
T value;
Node left;
Node right;
}
Вы гарантированно, что все значения к left
меньше или равно, чем value
и все значения к right
имеют больше или равно, чем value
. Это упрощает поиск. Если вы ищете элемент val
, вы просто сравниваете его с value
в текущем Node
. Если желаемый элемент равен текущему элементу, вы его нашли. Если он больше, он может быть только в правой части дерева. В противном случае в левой части.
Может случиться так, что элемента здесь нет. Это происходит, если вы видите, что он должен быть слева/справа от текущего узла, но там ничего нет (null
).
Так BinaryTreeSearch
является:
T search(Node tree, T val) {
int delta = tree.getValue.compareTo(val);
if (delta == 0) {
return tree.getValue;
} else if (delta > 0) {
return search(tree.getRight(), val);
} else {
return search(tree.getLeft(), val);
}
}
Но подождите ... это приводит к NPE, если элемент не здесь. Давайте изменим его:
T search(Node tree, T val) {
if (tree == null)
return null;
int delta = tree.getValue.compareTo(val);
if (delta == 0) {
return tree.getValue;
} else if (delta > 0) {
return search(tree.getRight(), val);
} else {
return search(tree.getLeft(), val);
}
}
Это можно также переписать следующим образом:
T search(Node tree, T val) {
int delta = tree.getValue.compareTo(val);
if (delta == 0) {
return tree.getValue;
} else if (delta > 0) {
if (tree.getRight() == null)
return null;
return search(tree.getRight(), val);
} else {
if (tree.getLeft() == null)
return null;
return search(tree.getLeft(), val);
}
}
Но здесь возникает тройная оператор, сократить и упростить if-else
.
result = testCondition ? value1 : value2
, который так же, как
if (testCondition) {
result = value1;
} else {
result = value2;
}
Другой условный оператор?, Который можно рассматривать как стенография для если-то-другое заявление (обсуждается в отчетности Flow Control раздел этого урока). Этот оператор также известен как тернарный оператор, поскольку он использует три операнда. В следующем примере этот оператор следует читать как: «Если someCondition является истинным, назначьте значение value1. В противном случае присвойте значение value2."
Таким образом, мы, наконец, получим:
T search(Node tree, T val) {
int delta = tree.getValue.compareTo(val);
if (delta == 0) {
return tree.getValue;
} else if (delta > 0) {
return (tree.getRight() == null) ? null : search(tree.getRight(), val);
} else {
return (tree.getLeft() == null) ? null : search(tree.getLeft(), val);
}
}
Что вы не понимаете троичное условие оператора или рекурсию – Eran
обе строки:?' Возвратных (! Левый = нуль) left.findNode (val): null; ' ' return (right! = null)? right.findNode (val): null; 'Я не знаю, как они работают – Joe
Java-тернарный оператор: http://alvinalexander.com/java/edu/ pj/pj010018 –