关于二叉搜索树镜像的问题

时间:2014-04-11 20:56:28

标签: binary-search-tree

我已经写了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("---------------------");
}

1 个答案:

答案 0 :(得分:0)

如果树是BST,则

isBST2()无法正确返回。

实际上它总是返回true。当nodenull时,它将返回true。进一步看到isBST2()中除了if(!leftOk)之外没有条件检查。因此,如果leftOktrue,则不会返回false。因此该函数始终返回true。因此这个功能不正确。

然而,函数isBST()是正确的。

所以你的猜测是正确的。


此外,当镜像BST时,它不会保留为BST,除非它只包含一个节点。