C 功能中的独立总和

Independent sum in C++ function

本文关键字:独立 功能      更新时间:2023-10-16

我希望我的程序在距离rb-tree的根部距离= 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);
}

,但是总和为空

当您声明这样的函数时:

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

函数获取的向量是您传递的向量的副本。因此,如果nsum修改了向量,那对称为nsum的代码中的向量没有影响。这称为按值传递。

您也可以通过引用传递,这将使对传递的同一向量的访问权限,并且在NSUM中进行的任何修改都会影响调用代码中的向量。您通过参考的方式就是这样:

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

注意"&amp;"。但是矢量不是必需的,您只需要跟踪总和即可。您可以做到这一点:

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

现在每次称为nsum时都可以修改sum int,并且会影响函数之外的值。

这个总和可以用简单的递归公式表示(许多与二进制树结构有关的事物也是如此):

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);
}