C ++函数中的独立求和

时间:2017-11-26 17:44:21

标签: c++

我希望我的程序计算节点中值的总和,这些节点距离RB树的根有距离= n。我有一个递归函数,找到这样的节点,但我不知道如何总结所有这些节点。看起来如何:

void nSum (RBTreeNode* B, int n) {
    if (B == NULL || n < 0)
        return;
    if (n == 0) {
        Integer* v = (Integer*) B->value;
        S += v->number // there I want to make an independent sum of them
        return;
    }
    nSum (B->right, n-1);
    nSum (B->left, n-1);
}

我是新手,我没有找到任何答案。

尝试以下方法:

    void nSum (RBTreeNode* B, int n, vector <int> sum) {
    if (B == NULL || n < 0)
        return;
    if (n == 0) {
        int* v = (int*) B->value;
        sum.push_back(v->number);
        return;
    }
    nSum (B->right, n-1, sum);
    nSum (B->left, n-1, sum);
}

但总和是空的

2 个答案:

答案 0 :(得分:1)

这个总和可以用一个简单的递归公式表示(与二叉树结构有关的很多东西):

S(root, 0) = root->value;
S(root, n) = S(root->left_child, n - 1) + S(root->right_child, n - 1); 

您可能会从公式中注意到仅仅两次调用递归函数是不够的。你需要实际总结结果。这意味着该函数必须返回甚至可以求和的东西:

int nSum (RBTreeNode* B, int n) {
   // Take a stab at completing it yourself

   return nSum(B->left, n-1) + nSum(B->right, n-1);
}

答案 1 :(得分:1)

当您声明这样的函数时:

void nSum (RBTreeNode* B, int n, vector <int> sum)

函数获取的向量是传入的向量的副本。因此,如果nSum修改向量,则对调用nSum的代码中的向量没有影响。这称为按值传递。

您也可以通过引用传递,这将使nSum访问传入的相同向量,并且在nSum中进行的任何修改都将影响调用代码中的向量。你通过引用传递的方式是这样的:

void nSum (RBTreeNode* B, int n, vector <int>& sum)

注意“&amp;”。但是矢量不是必需的,你只需要跟踪总和。你可以这样做:

void nSum (RBTreeNode* B, int n, int& sum)

现在每次调用nSum时都可以修改sum int,它会影响函数外的值。