问题描述
试图解决 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。因此,正确的算法将通过 两个 递归调用的限制值:下限和上限。