我希望我的程序计算节点中值的总和,这些节点距离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);
}
但总和是空的
答案 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,它会影响函数外的值。