【问题标题】:Traversal of a tree to find a node遍历树以找到节点
【发布时间】:2011-01-16 13:43:09
【问题描述】:

我正在搜索一棵树以查找传递的值。不幸的是,它不起作用。我开始用 print 调试它,奇怪的是它实际上找到了值,但跳过了 return 语句。

    /**
  * Returns the node with the passed value
  */
 private TreeNode searchNodeBeingDeleted(Comparable c, TreeNode node)
 {  
  if(node == null) 
  {
   return null;
  }

  if(c.equals((Comparable)node.getValue()))
  {
   System.out.println("Here");
   return node;
  }
  else
  {
   if(node.getLeft() != null)
   {
    System.out.println("left");
    searchNodeBeingDeleted(c, node.getLeft());
   }
   if(node.getRight() != null)
   {
    System.out.println("right");
    searchNodeBeingDeleted(c, node.getRight());
   }
  }
  return null; //i think this gives me my null pointer at bottom
 }

它打印出结果如下:

left
left
right
right
Here
right
left
right
left
right
Exception in thread "main" java.lang.NullPointerException
at Program_14.Driver.main(Driver.java:29)

我不知道这是否会有所帮助,但这是我的树:

     L
   /   \
  D     R
 / \   / \
A   F M   U
 \       / \
  B     T   V

感谢您的宝贵时间。

【问题讨论】:

    标签: java algorithm recursion binary-tree


    【解决方案1】:

    假设您的树是 binary search tree 而不是 "regular" binary tree

    您应该返回递归调用,而不是在方法结束时返回 null

    类似这样的:

    private TreeNode searchNodeBeingDeleted(Comparable c, TreeNode node) {
        if(nodle == null) return null;
        int diff = c.compareTo((Comparable)node.getValue());
        if (diff == 0) { // yes, we found a match!
            System.out.println("Here");
            return node;
        }
        else if (diff < 0) { // traverse to the left
            System.out.println("left");
            return searchNodeBeingDeleted(c, node.getLeft());
        }
        else {  // traverse to the right
            System.out.println("right");
            return searchNodeBeingDeleted(c, node.getRight());
        }
    }
    

    【讨论】:

    • @moron,不,它没有,但 OP 示例中的 10 个节点已排序。当然可能是巧合......此外,如果树不是 BST,我认为没有理由将存储在树中的值保留为 Comparable。不过,您说得有道理:我在回答中添加了我的假设。
    【解决方案2】:

    试试这个:

    private TreeNode searchNodeBeingDeleted(Comparable c, TreeNode node)
     {  
      if(node == null) 
      {
       return null;
      }
    
      if(c.equals((Comparable)node.getValue()))
      {
       System.out.println("Here");
       return node;
      }
      else
      {
       if(node.getLeft() != null)
       {
        System.out.println("left");
        TreeNode n = searchNodeBeingDeleted(c, node.getLeft());
        if (n != null) {
          return n;
        }
       }
       if(node.getRight() != null)
       {
        System.out.println("right");
        TreeNode n = searchNodeBeingDeleted(c, node.getRight());
        if (n != null) {
          return n;
        }
       }
      }
      return null; //i think this gives me my null pointer at bottom
     }
    

    【讨论】:

      【解决方案3】:

      您在函数中使用递归。您看到的“此处”是从同一函数创建的函数调用的结果。所以它会给'recursing'函数返回一个值,此时你还没有完成,即使你找到了答案,你仍然需要继续向上传播。

      【讨论】:

        【解决方案4】:

        我认为你必须返回 searchNodeBeingDeleted(c, node.getLeft())searchNodeBeingDeleted(c, node.getRight()) 的值,而不仅仅是调用这些方法。

        【讨论】:

        • 其实只有不为空才需要返回
        • 所以我返回了这两个语句,但我仍然得到具有以下输出的空指针:left,left,right,null 错误它在右侧节点处停止,但在找到时似乎返回 null它...
        • 可能你调用了两次方法,这是错误的。您应该在这样的变量中取值:TreeNode n = searchNodeBeingDeleted(c, node.getLeft()); 然后测试 null:if (n != null) {return n;}
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多