我已经编写了以下代码来递归搜索二叉树。 即使我的system.out语句被执行,return语句也不会返回整个递归,因此这个方法不会返回true。
任何人都可以建议我如何退出整个递归。?
public static boolean isElementinTree(int num, BinaryTreeNode root)
{
if (root != null)
{
int rootVal = root.getData();
BinaryTreeNode left = root.getLeft();
BinaryTreeNode right = root.getRight();
if (left != null)
{
isElementinTree(num,left);
}
if (right != null)
{
isElementinTree(num,right);
}
if (num == rootVal)
{
System.out.println("------ MATCH -----");
return true;
}
}
return false;
}
答案 0 :(得分:11)
这是问题所在:
if (left != null)
{
isElementinTree(num,left);
}
if (right != null)
{
isElementinTree(num,right);
}
在这些情况下,您调用方法 - 但忽略了结果。我怀疑你只是想改变其中的每一个,如果找到的话立即返回:
if (left != null && isElementinTree(num, left))
{
return true;
}
if (right != null && isElementinTree(num, right))
{
return true;
}
或者为了使整个事情更具说明性,你可以更简单地做到:
public static boolean isElementinTree(int num, BinaryTreeNode root)
{
return root != null && (root.getData() == num ||
isElementInTree(num, root.getLeft()) ||
isElementInTree(num, root.getRight()));
}
使用第二个参数调用isElementInTree
是可以的,因为你已经用第一个部分保护了它。
答案 1 :(得分:0)
您需要检查该值是否在其中一个分支中,并保存该结果。
初始化变量boolean found = false;
。
当您进行递归调用时,您需要执行以下操作:
found = isElementinTree(num,left)
右侧同样如此。
最后,不是返回false,而是检查是否在分支上找到了值,只需return found;
此外,首先检查您要查找的号码是否不在节点本身上,而不是先搜索每个分支。只需切换if的顺序。
答案 2 :(得分:0)
如果您确实在左侧或右侧子树中找到了您要查找的元素,则需要将此事实返回给调用者:
if (left != null)
{
if(isElementinTree(num,left)) return true;
}
if (right != null)
{
if(isElementinTree(num,right)) return true;
}
只有当您在左侧树,右侧树和当前节点中找不到它时,您才会最终进入最终return false
。
答案 3 :(得分:0)
递归解决方案:
boolean isElementinTree (int num, BinaryTreeNode root)
{
if(root == null)
return false;
if(root.value == num)
return true;
boolean n1 = isElementinTree(num,root.getLeft());
boolean n2 = isElementinTree(num,root.getRight());
return n1 ? n1 : n2;
}
答案 4 :(得分:0)
像这样的简单解决方案有什么问题:
public static boolean isElementinTree(int num, BinaryTreeNode root)
{
return root != null && //The tree is non-null
(num == root.getData() || //We have num in this node OR
isElementInTree(num, root.getLeft()) || //We have num in left subtree OR
isElementInTree(num, root.getRight()) ); //We have num in right subtree
}