求二叉树c ++的平均值

时间:2013-01-25 04:06:19

标签: c++ recursion binary-tree

所以我试图编写一个递归函数来返回c ++中二进制值的平均值。这就是我所拥有的,这不起作用:

double avg(bNode* root)
{
    if(!root) return 0;
    int sum = avg(root->left) + avg(root->right) + root->value;
    if(root->left && root->right) return sum/3;
    else if(!root->left && !root->right) return sum;
    else return sum/2;
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这是一个非常简单的例子,可以说明为什么你计算的不是平均值:

    10
   /  \
  4    12 
         \
          20

在'12'节点,平均值为(12 + 20) / 2 = 16

然后在10节点,平均值为(4 + 10 + 16) / 3 = 10

但是,平均值确实为11.5

问题是平均值的平均值不等于一个大的正确平均值。在每个级别,您必须将平均值乘以用于计算它的节点数(即总和),然后再在下一次平均计算中使用它。

更简单的方法是计算总和,然后除以树中的节点数。

执行此操作的一些伪代码将是:

class accumulator
{
    int sum = 0;
    int count = 0;

    // implement the obvious operator+
};

accumulator avg(bNode* root)
{
    if(!root) return <empty accumulator>
    return <recursive children> + <self>;
}

int main()
{
    accumulator acc = avg(root);
    // ..calculate average..
}