我想知道这种检查BST的正确有效方法。
我的代码是确定树是否是二叉搜索树。请随意更正,但它必须是下面的方法,并被要求检查树中的每个节点一次。
需要使用名为public static boolean isBST(BinaryTree<String> tree)
以下是我的算法和代码:
public static boolean isBST(BinaryTree<String> tree)
{
return isBST(tree.root);
}
private static boolean isBST(BinaryNode<String> root) {
if(root==null)
return true;
else{
if(root.getLeftChild().getData().compareTo(root.getData())<0&&root.getRightChild().getData().compareTo(root.getData())>0)
return true;
else
return false;
}
}
我采用这种方法使用泛型和静态方法。
答案 0 :(得分:2)
您发布的代码只检查根节点的直接子节点是否遵循BST属性。但是,您需要为整个左右子树执行此操作。实现相同的一种方法如下:
public static boolean isBST(BinaryTree<String> tree) {
return isBSTChecker(tree.root, MIN, MAX);
}
public static boolean isBSTChecker(BinaryNode<String> node, T min, T max) {
if(node == null) return true;
else if(node.getData().compareTo(min) < 0 || node.getData().compareTo(min) > 0) return false;
else return isBSTChecker(node.getLeftChild(), min, node.getData()) && isBSTChecker(node.getRightChild(), node.getData(), max);
}
在此方法中,您需要为泛型定义MIN和MAX值。一种方法是遍历整个树并找到最小值和最大值。该方法的时间复杂度为O(n),并且它使用恒定的额外空间。
您可以实现检查程序的另一种方法如下:
ArrayList<BinaryNode> list = new ArrayList<>();
public static boolean isBST(BinaryTree<String> tree) {
inOrder(tree.root);
return isBSTChecker(list);
}
public static boolean isBSTChecker(ArrayList<BinaryNode> inorder) {
boolean isBST = true;
BinaryNode prev = inorder.get(0);
for(int i=1; i<inorder.size(); i++) {
BinaryNode curr = inorder.get(i);
if(curr.getData().compareTo(prev.getData()) < 0) {
isBST = false;
break;
}
prev = curr;
}
return isBST;
}
public static void inOrder(BinaryNode<String> node) {
if(node == null) return;
inOrder(node.getLeftChild());
list.add(node);
inOrder(node.getRightChild());
}
在此方法中,我们首先对树进行顺序遍历,然后检查此遍历的结果是否按升序排序。这种方法的时间和空间复杂度都是O(n)。您可以通过在顺序遍历期间跟踪先前访问的节点并检查当前节点上的数据是否大于先前已确定的节点来消除线性空间复杂性。
来源:http://www.geeksforgeeks.org/a-program-to-check-if-a-binary-tree-is-bst-or-not/