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)))