Я не могу понять, как функция Java ЗДЕСЬ (прокрутите страницу до самого конца страницы) проверяет, является ли дерево BST или нет, поскольку код не похож на использование min и max вообще. Я также копирую код здесь
/**
Tests if a tree meets the conditions to be a
binary search tree (BST). Uses the efficient
recursive helper.
*/
public boolean isBST2() {
return( isBST2(root, Integer.MIN_VALUE, Integer.MAX_VALUE) );
}
/**
Efficient BST helper -- Given a node, and min and max values,
recurs down the tree to verify that it is a BST, and that all
its nodes are within the min..max range. Works in O(n) time --
visits each node only once.
*/
private boolean isBST2(Node node, int min, int max) {
if (node==null) {
return(true);
}
else {
// left should be in range min...node.data
boolean leftOk = isBST2(node.left, min, node.data);
// if the left is not ok, bail out
if (!leftOk) return(false);
// right should be in range node.data+1..max
boolean rightOk = isBST2(node.right, node.data+1, max);
return(rightOk);
}
}
Дерево является BST тогда и только тогда, когда узлы обходного пути являются монотонными. Самый простой способ подумать об этом состоит в том, что если корень имеет значение n, то левая ветвь также должна быть BST, узлы которой не более n, а правая часть должна быть BST, узлы которой не менее n, Если эти условия выполнены, то дерево в целом является BST.
Это именно то, что ваш код почти делает. Он проверяет, что дерево является BST с заданным минимумом заданного максимума. Он рекурсивно вызывает себя, просматривая корневой узел с данными значения, а затем проверяет, что левая ветвь является BST, ни один из узлов которой не превышает данные, а правая ветвь - BST, ни один из узлов которой меньше данные.
Но на самом деле это не совсем так... он пропускает проверку мин/макс! Возможно, вы должны добавить это сами? Это домашнее задание?
Место для его добавления будет здесь:
if (node==null) {
return(true);
}
Вам просто нужно несколько дополнительных условий, если node!=null
...
boolean checkBST(Node root) {
return c(root, Integer.MIN_VALUE, Integer.MAX_VALUE);
}
boolean c(Node n, int s, int b) {
return n == null || (n.data > s && n.data < b && c(n.left, s, n.data) && c(n.right, n.data, b));
}