【问题标题】:java-loop inside a recursive method递归方法中的java循环
【发布时间】:2017-05-14 16:10:43
【问题描述】:

我有一个名为TrieNode 的类,它有一个char 键和triNode 的arrayList。我正在尝试实现一个 trie。

结构:

例如,根键是 '.'孩子是 t,o,s 和 p。对于键为“s”的节点,子节点是 t 和 p。我想计算树中的节点数。我用过这个算法

public int size(TrieNode tmp, int n){

    if(tmp.children.isEmpty()){
        return 0;
    }

    for(int i=0;i<tmp.children.size();i++){
        return 1 + size(tmp.children.get(i), n);
    }


    return 1;
}

问题是 i 对于每个调用都不是唯一的。因此该方法在根上调用,然后是 s,然后是子 t,然后是 t,然后是 o,直到 p。当它再次返回到 s 时,它不会调用 p 上的方法。

如何解决这个问题?

【问题讨论】:

  • 为什么要混合递归和循环?
  • 因为我想遍历数组列表以便在所有节点上调用我的方法。
  • @Aominè 为什么不呢?如果你有一棵树并且需要在每个节点上递归,我认为循环遍历给定节点的所有子节点并在每个节点上递归是可以的
  • 你的 for 循环有一个 return 语句。只访问第一个孩子。

标签: java


【解决方案1】:

问题是您退出了第一个元素的循环。如果要对所有元素求和,则需要在返回父级之前对递归结果求和。

public int size(TrieNode tmp, int n){

    int sum = 0;
    for(int i=0;i<tmp.children.size();i++){
        sum +=  size(tmp.children.get(i), n);
    }

    if(/* node has char n */){
      return sum + 1;
    }
    return sum ;
}

【讨论】:

  • 这就是堆栈的用途。递归函数一开始可能很棘手,但后来它们很容易:)
【解决方案2】:

对该算法使用 DFS。您访问的每个节点都是一个子节点。访问该子节点后总结计数。做这样的事情..

//the root is the first node to be passed on.**
void size(TrieNode node){
if(node is null) return;
if(node is not null) result.add(node);

 while(there exist childNode in node){
   size(childNode);
}
}

Result 是一个包含树的所有节点的 ArrayList。 result.size() 为您提供树中的节点数。

【讨论】:

    猜你喜欢
    • 2017-02-28
    • 2014-06-30
    • 2017-10-26
    • 1970-01-01
    • 2020-06-28
    • 2012-08-04
    • 1970-01-01
    • 2020-10-01
    • 2016-03-19
    相关资源
    最近更新 更多