【问题标题】:Questions on binary search tree mirroring二叉搜索树镜像问题
【发布时间】: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("---------------------");
}

【问题讨论】:

    标签: binary-search-tree


    【解决方案1】:

    如果树是否为 BST,isBST2() 不会正确返回。

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

    而函数isBST()是正确的。

    所以你的猜测是正确的。


    另外,当一个 BST 被镜像时,它不会一直是一个 BST,除非它只包含一个节点。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 2016-02-03
    • 1970-01-01
    相关资源
    最近更新 更多