递归搜索二叉树问题

时间:2012-08-07 13:49:22

标签: java search recursion tree binary-tree

我已经编写了以下代码来递归搜索二叉树。 即使我的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;
}

5 个答案:

答案 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
}