[英]Return in case of Recursive call to a method
我有一段代码需要深入了解,我不想知道该问题的正确解决方案。 我只想知道为什么我的概念失败了。 所以功能是检查二叉树是否是BST。 如果需要返回1,否则返回0。 我的代码如下
int isBST(Node root) {
if(root == null)
return 1;
if(root.left!=null) {
if(root.left.data<root.data)
isBST(root.left);
else
return 0; // line:a
}
if(root.right!=null) {
if(root.right.data<root.data)
isBST(root.right);
else
return 0;
}
return 1;
}
对于这一部分,当我有如下的二叉树时:
5
\
7
/
8
我希望它达到8的值并在line:a处中断,但是它返回1而不是0。现在我知道0返回到父调用方法。 但这不是因为我进行了isBST调用而没有捕获返回值而终止吗? 请不要指出是否还有其他错误。
对于一般情况,您的方法行不通。 测试树是否为BST的方法是递归检查当前节点是否大于左侧子树的最大元素,并且小于右侧子树的最小元素。 另外,您在递归调用中缺少返回值:
return isBST(root.left);
...
return isBST(root.right);
顺便说一句,为什么要为此返回0
或1
? 请使用false
或true
,将返回类型更改为boolean
。
您应该检查正确的数据是否大于当前数据,并返回递归调用的值
if(root.right.data>root.data)
我看到以下问题:
isBST(root.left)
或isBST(root.right)
为false,则需要立即返回0(顺便说一句,为什么不使用布尔值?)。 root.right.data<root.data
应该被反转: root.right.data>=root.data
。 因此,这是修改后的代码(保留int
返回类型):
int isBST(Node root) {
if(root == null)
return 1;
if(root.left!=null) {
if(root.left.data<root.data) {
if (isBST(root.left) == 0)
return 0;
} else
return 0;
}
if(root.right!=null) {
if(root.right.data>=root.data) {
if (isBST(root.right) == 0) {
return 0;
}
} else
return 0;
}
return 1;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.