Проблема заключается в том, что вы проверяете, что условие выполняется только для непосредственных потомков, а не для всего левого и правого поддеревьев.Вы можете увидеть проблему с вашим кодом визуально в этом примере.
3
/ \
2 5
/ \
1 4
Вы можете видеть, что узел 4
больше, чем его родитель, но не меньше, чем его прародитель.Однако это не должно иметь место, поскольку каждый узел слева от 3
должен быть меньше трех.
Проблема состоит в том, что для каждого узла левые потомки должны быть меньше, чем этот узел, иправые потомки должны быть больше, чем этот узел.Вам нужно отслеживать минимальное и максимальное значение, которое может принять узел.
boolean checkBST(Node root) {
return checkBST(node, Integer.MIN_VALUE, Integer.MAX_VALUE);
}
boolean checkBST(Node root, int min, int max) {
if(root == null) return true;
if(root.data < min || root.data > max) return false;
return checkBST(root.left, min, root.data) && checkBST(root.right, root.data, max);
}
Мы возвращаем true
в случае, если root
равно null
, потому что это легчекстати, когда нам не нужно проверять, что левый и правый узлы не null
перед вызовом checkBST
на них.Следующее, что вам нужно проверить, это то, что значение root
попадает в допустимый диапазон.И последний шаг - убедиться, что все детские ценности также находятся в правильных пределах.Все левые потомки должны быть меньше корня, а правые потомки должны быть больше корня.Таким образом, для проверки левых потомков мы делаем значение корня максимальным, а для правых потомков мы делаем значение корня минимальным.