【问题标题】:Searching in a unsorted tree recursively递归搜索未排序的树
【发布时间】:2015-06-29 17:05:31
【问题描述】:

我正在尝试在树中搜索元素 e,但是正如您所见,我的 search(Position,E) 没有返回位置。但是,当我添加“return null;”时在方法结束时。它仅在我要查找的位置位于其父级的最左侧的位置时才有效,否则返回 null。我怎样才能让它一直工作直到它到达树的尽头?

public Position<E> search(E e) {
    return search(root(), e);
}

public Position<E> search(Position<E> p, E e) {
    if(p.getElement().equals(e))
        return p;
    for(Position<E> c: children(p))
            return search(c, e);
}

【问题讨论】:

  • childeren(p) 返回什么?
  • 你的职位有leftNode和rightNode吗?树是二叉树吗?还是 n 进制?
  • @Alp children(p) 返回一个 Iterable>,它是节点 p 的子节点,
  • @pedromss 这是一棵普通的树

标签: java algorithm data-structures tree


【解决方案1】:

我认为问题出在这个循环中:

for(Position<E> c: children(p))
        return search(c, e);

假设您要搜索的元素位于节点的第二个子节点中,而不是第一个子节点中。使用上面的代码,在循环的第一次迭代中,您将递归地探索第一个孩子,它返回 false,然后立即返回 false,而没有机会探索第二个孩子。换句话说,您的方法只查看第一个孩子,因此它可能找不到您要查找的内容。

要解决此问题,请尝试像这样重写代码:

if(p.getElement().equals(e))
    return p;

for(Position<E> c: children(p)) {
    Position<E> result = search(c, e);
    if (result != null) return result;
}
return null;

这会在每个子树中进行递归调用。如果任何一个调用未能找到该元素,那很好 - 您只需继续下一个。如果任何一个调用确实找到了该元素,则返回它。如果没有任何调用找到该元素,则返回 null 表示失败。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    您需要跟踪每个子树及其返回值。尝试以下方法:

    public Position<E> search(E e) {
        return search(root(), e);
    }
    
    public Position<E> search(Position<E> p, E e) {
        if(p.getElement().equals(e)) {
            return p;
        }
        for(Position<E> c: children(p)) {
            Position tmp = search(c, e);
            if (tmp != null) {
                return tmp;
            }
        }
        return null;
    }
    

    谢谢,

    尤里

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-13
      • 2016-11-13
      • 2017-01-14
      • 2017-07-06
      • 2016-07-17
      • 2014-08-12
      • 2017-09-26
      • 2014-01-02
      相关资源
      最近更新 更多