在 GeeksForGeeks 上解决“Check for BST”问题,但一直得到错误的答案,但我似乎找不到问题所在有人可以解释一下吗?

问题描述

试图解决 GeeksForGeeks 上的“检查 BST”问题,但我不断收到错误错误,但我认为我的代码没有问题。有人可以看看我的代码并解释一下吗?谢谢。

public class Solution
{
    //Function to check whether a Binary Tree is BST or not.
    static boolean answer = true;
    
    boolean isBST(Node root)
    {
        // code here.
        if(root==null) return false;
        
        traverseLeft(root.left,root.data);
        traverseRight(root.right,root.data);
        return answer;
    }
    
    void traverseLeft(Node root,int val){
        if(root == null) return;
        
        if(root.data >= val){
             answer = false;
             return;
        }
        
        traverseLeft(root.left,root.data);
    }
    
    void traverseRight(Node root,int val){
        if(root == null) return;
        
        if(root.data <= val){
             answer = false;
             return;
        }
        
        traverseLeft(root.left,root.data);
    }
}

解决方法

您的尝试有几个问题:

  • result 不应是静态变量。作为一个静态变量,它的值将在不同的测试用例中保持不变,在第一次测试运行后永远不会重置为 true,因此可能会出现假阴性。

    相反,您应该让递归函数返回 BST 在那个特定子树中是否有效。然后,调用者应为其两个子项捕获该布尔结果,并执行逻辑 AND 以确定其自己的响应是什么:当且仅当对子项的递归调用都为真且其自己的值在可接受的范围。在所有其他情况下,它应该返回 false。这样你就不需要更多的全局变量了。

  • 将一个节点的值与其父节点的值进行比较是不够的。例如,您的逻辑会将以下树视为有效的 BST,但它不是:

            6
           /
          1
           \
            10
    

    虽然值 10 通过了您的代码的测试(至少为 1),但它应该不大于 6。因此,正确的算法将通过 两个 递归调用的限制值:下限上限。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...