我已经写了2个方法来查明树是否是BST。大多数这些样本来自网上的斯坦福课程。
镜像前: 树是BST:true(第一种方法的结果) 树是BST2:true(来自第二种方法的结果)
镜像后: 树是BST:false(第一种方法的结果) 树是BST2:true(来自第二种方法的结果)
如果镜像了二叉搜索树。我相信它不再是BST了。是对的吗? 第二种方法错了吗?
//mirror
public void mirror(){
mirror(root);
}
private void mirror(Node node){
if(node == null) return;
if( node != null){
mirror(node.left);
mirror(node.right);
Node temp = node.left;
node.left = node.right;
node.right = temp;
}
}
public boolean isBST(){
return isBST(root);
}
private boolean isBST(Node node){
if( node == null) return true;
if( node.left != null && maxValue(node.left) > node.data) return false;
if( node.right != null && minValue(node.right) <= node.data) return false;
return (isBST(node.left) && isBST(node.right));
}
public boolean isBST2(){
return isBST2(root, Integer.MIN_VALUE, Integer.MAX_VALUE);
}
private boolean isBST2(Node node, int minVal, int maxVal){
if( node == null) return true;
else{
boolean leftOk = isBST2(node.left, minVal, node.data);
if(!leftOk) return false;
boolean rightOk = isBST2(node.right, node.data+1, maxVal);
return rightOk;
}
}
//insert with inserts - tree increases on right if inserted in order
bt = new BinaryTree();
bt.insert(5);
bt.insert(3);
bt.insert(7);
bt.insert(1);
bt.insert(4);
bt.insert(6);
bt.insert(9);
bt.printTree();
bt.printPostorder();
System.out.println("max depth: " + bt.maxDepth());
System.out.println("min value: " + bt.minValue());
System.out.println("max value: " + bt.maxValue());
System.out.println("size of tree: " + bt.size());
System.out.println("Has path sum 8: " + bt.hasPathSum(8));
System.out.println("Has path sum 9: " + bt.hasPathSum(9));
bt.printPath();
System.out.println("Trees are same: " + bt.sameTree(bt));
System.out.println("Trees is BST: " + bt.isBST());
System.out.println("Trees is BST: " + bt.isBST2());
bt.mirror();
System.out.println("Path after mirroring BST");
bt.printPath();
System.out.println("Trees is BST: " + bt.isBST());
System.out.println("Trees is BST: " + bt.isBST2());
System.out.println("---------------------");
}
答案 0 :(得分:0)
isBST2()
无法正确返回。
实际上它总是返回true
。当node
为null
时,它将返回true。进一步看到isBST2()
中除了if(!leftOk)
之外没有条件检查。因此,如果leftOk
为true
,则不会返回false
。因此该函数始终返回true
。因此这个功能不正确。
然而,函数isBST()
是正确的。
所以你的猜测是正确的。
此外,当镜像BST时,它不会保留为BST,除非它只包含一个节点。