【问题标题】:Java recursion and retain informationJava递归和保留信息
【发布时间】:2015-03-22 20:13:37
【问题描述】:

我有一个方法需要遍历嵌套元素并返回一个字符串,该字符串应该作为遍历树的结果连接起来。通过搜索,我相信递归将是一种更简单的方法,但我无法获得所需的结果。

数据结构:

root
  child 1
    child 1.1
    child 1.2
  child 2
    child 2.1
    child 2.2
      child 2.2.1
  child 3

好的,就是这个意思。我需要从一个孩子开始循环,通过列出从孩子起点到根的元素来找到到根的路径。

例如:我正在寻找孩子 2.2.1。返回答案应该是:

child 2.2.1,child 2.2, child 2, root

Private String loopthrough(String name, String needed LinkedList myList)

        List<String>Children = new ArrayList<String>();
        for (String child : children)
        {

            if (child.isParentOf(needed ))
            { name+=child.getName
             }
            else{
                goneThrough.add(child);
            }
        }
        children = goneThrough;

        for (String child : children)
        {
            loopthrough(child);
        }

【问题讨论】:

  • 请添加您目前拥有的代码,以及您遇到问题的哪一部分。
  • @Keppil 我包含了代码
  • 请解释你为什么投反对票,如果有的话请给出答案!
  • 投反对票可能是因为您发布了代码但没有解释它以何种方式无法解决您的问题。例如,为什么您发布的代码无法编译。
  • 你写了从一个孩子开始寻找到根的路径所以如果数据结构的接口在你手中,只需向它添加一个getParent()方法并调用getParent() 直到到达根节点。如果您只有 isParentOf 方法 getParent 可以通过迭代所有节点来实现,即在 hyrarchie 中当前节点的上一层。 (就像说这仅适用于您真正从子节点开始...)

标签: java loops recursion


【解决方案1】:

您可以通过在下降树时将访问的节点推送到所需路径上来避免递归,这样它们就会按照您希望显示它们的顺序弹出。

【讨论】:

  • 这个问题是不是我访问的每个节点都需要包含,只有将元素追溯到父节点的那个节点。 eg:在搜索2.2.1时,我可能会访问1,但是1,不需要包含
  • 所以只推送需要包含的那些(“在所需路径上”)。
【解决方案2】:

使用 StringBuilder(或 PrintWriter,或 StringWriter)作为输入输出参数。

StringBuilder sb = new StringBuilder():
tree.dumpTree(sb);
System.out.println(sb);
String s = sb.toString();

这还有一个额外的好处,那就是不是在每次调用时都会发生将字符串连接到新字符串的情况。


在这种情况下,您可以在递归返回时构建结果。我仍然不明白您的数据结构是什么,以及正确的参数是什么。带字符串:

private String loopthrough(String name, String needed, List<?> myList)
{
    if (name.equals(needed)) {
        return name;
    }

    for (String child : children) {
        String partialResult = loopthrough(child, ...);
        if (partialResult != null) {
            return name + " " + partialResult;
        }
    }
    return null; // Not found in this subtree.
}

当然,我们无法知道您使用的数据结构。我在这里假设children 是直接子节点。而在递归中,人们宁愿解析节点,也就是名称字符串。

【讨论】:

  • 数据不一定是树,只有结构。还可以解释一下吗?
  • 我们这里需要知道你使用的是哪种数据结构,显然不是缩进字符串的列表。例如,可以维护一个直系父母的列表(堆栈)。在找到needed 时,可以解释结果。我会在答案中给出提示:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
  • 2012-05-31
相关资源
最近更新 更多