Recursion 函数检查二叉树是否为二叉搜索树?

Recursion 函数检查二叉树是否为二叉搜索树?,recursion,boolean,binary-tree,binary-search-tree,Recursion,Boolean,Binary Tree,Binary Search Tree,我尝试编写以下方法来判断二叉树是否是二叉搜索树?我只通过了一半的测试用例。我做错了什么 boolean checkBST(Node root) { boolean leftflag = false; boolean rightflag = false; Node l = root.left; Node r = root.right; if(l!=null) { if(root.data <= l.data) {

我尝试编写以下方法来判断二叉树是否是二叉搜索树?我只通过了一半的测试用例。我做错了什么

boolean checkBST(Node root) {

    boolean leftflag = false;
    boolean rightflag = false;

    Node l = root.left;
    Node r = root.right;

    if(l!=null) { 
        if(root.data <= l.data) {
            leftflag = false;
        }
        else { 
            leftflag = true;
            checkBST(l);
        }
    }
    if(leftflag == false)
        return false;
    if(r != null) {
       if(root.data >= r.data) {
           rightflag = false;
       }
       else {
           rightflag = true; 
           checkBST(r);
       }
    }
    if(rightflag == false)
        return false;

    return true;
}
boolean checkBST(节点根){
布尔leftflag=false;
布尔rightflag=false;
节点l=root.left;
节点r=根。右;
如果(l!=null){
if(root.data=r.data){
rightflag=false;
}
否则{
rightflag=true;
检查BST(r);
}
}
如果(rightflag==false)
返回false;
返回true;
}

我可以看到您的程序可能返回错误的false

假设你有一棵树,有3根深的树枝,如下所示:

           7
        /     \
       3       8
        \     / \
         4   6   9

程序在7(根)处启动,在false处创建两个布尔值(leftflag和rightflag),检查left是否为null。事实并非如此。然后检查left的数据是否主要错误是忽略了递归调用的返回值。例如:

    else { 
        leftflag = true;
        checkBST(l);
    }
}
if(leftflag == false)
    return false;
如果checkBST(l)返回false,则忽略它。你永远不会保存价值。因此,您随后对leftflag的检查完全不知道子树的适用性。从语义上讲,例程假设所有子树都是BST——设置标志,在子树上重复,但不更改标志。试试这个逻辑:

else
    leftflag = checkBST(l)
现在,请熟悉布尔表达式。例如,针对布尔常量测试布尔值有点浪费。而不是

if (flag == false)
直接查看即可:

if (!flag)
在大多数语言中,检查指针是否为空与此类似:

if (l)
最后,如果只是将标志设置为与第一个操作相同的值,则不要初始化标志

现在,您的代码可能如下所示:

    boolean leftflag = false;
    boolean rightflag = false;

    if(l) { 
        if(root.data > l.data) {
            leftflag = checkBST(l);
        }
    }
    if(!leftflag)
        return false;

    if(r) {
       if(root.data < r.data) {
           rightflag = checkBST(r);
       }
    }
    if(rightflag == false)
        return false;

    return true;
}
return
    (!root.left ||            // Is  left subtree a BST?
      (root.data > root.left.data &&
       checkBST(root.left)))
    &&
    (!root.right ||           // Is right subtree a BST?
      (root.data > root.right.data &&
       checkBST(root.right)))

欢迎来到StackOverflow。请阅读并遵循帮助文档中的发布指南。适用于这里。在您发布代码并准确描述问题之前,我们无法有效地帮助您。具体来说,您发布的代码没有任何作用:没有测试驱动程序。此外,您未能演示一个失败的案例。
    boolean leftflag = false;
    boolean rightflag = false;

    if(l) { 
        if(root.data > l.data) {
            leftflag = checkBST(l);
        }
    }
    if(!leftflag)
        return false;

    if(r) {
       if(root.data < r.data) {
           rightflag = checkBST(r);
       }
    }
    if(rightflag == false)
        return false;

    return true;
}
return
    (!root.left ||            // Is  left subtree a BST?
      (root.data > root.left.data &&
       checkBST(root.left)))
    &&
    (!root.right ||           // Is right subtree a BST?
      (root.data > root.right.data &&
       checkBST(root.right)))