【发布时间】:2014-04-14 00:05:54
【问题描述】:
我写了 2 种方法来确定一棵树是否是 BST。这些样本大部分来自斯坦福的网络课程。
镜像前: 树是 BST:真(第一种方法的结果) 树是 BST2:真(第二种方法的结果)
镜像后: 树是 BST:假(第一种方法的结果) 树是 BST2:真(第二种方法的结果)
如果二叉搜索树被镜像。我相信它不再是 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("---------------------");
}
【问题讨论】: