【问题标题】:find and return the sum of all nodes present in a generic tree in c++查找并返回 C++ 中通用树中存在的所有节点的总和
【发布时间】:2021-09-10 10:45:54
【问题描述】:

我想递归地找到树(不是二进制)中所有节点的总和,我已经尝试过了,但我没有得到正确的答案。一般来说,我很难理解递归在问题中的工作原理,我无法理解它的工作原理。请帮助

int sum(TreeNode<int>* root){

      int s = 0;
      for(int i=0; i<root->child.size(); i++){
            s += root->data;
            sum(root->child[i]);
      }
      return s;

}

请看一下树形结构:Tree Structure Image

【问题讨论】:

  • 这必须是递归的吗?使用std::queuefor 循环的级别顺序遍历在程序堆栈上的密集程度较低。
  • int sum(TreeNode&lt;int&gt;* root) 这个函数返回总和。 sum(root-&gt;child[i]); 这个调用使用返回值。,你计算它然后把它扔掉。 OTOH s += root-&gt;data; 这是循环执行的。如果您的节点有 N 个子节点,则将节点自己的数据求和 N 次。如果它没有孩子,那么它的数据根本不会影响总和。
  • 如何在每次通话中存储子数据而不是直接丢弃?
  • @Jessica 递归执行此操作似乎很尴尬,IMO。一个简单的level order traversal 更整洁,如果有很多节点,也不会爆出程序堆栈。

标签: c++ recursion tree


【解决方案1】:

对于具有n 子级的通用树,您可以将递归关系视为:

sum(tree) = value(root) + sum(child[0]) + sum(child[1]) + ... + sum(child[n-1])

那么,递归解决方案很简单:

int sum(TreeNode<int>* root)
{
    // value(root)
    int s = root->data;

    // no. children
    int n = root->child.size();

    // + sum(child[0]) + sum(child[1]) + ... + sum(child[n-1])
    for (int i = 0; i < n; ++i) {
        s += sum(root->child[i]);
    }

    return s;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多