C++ 将树的每个节点替换为节点左侧所有值的总和,而不使用额外的整数指针参数

C++ 将树的每个节点替换为节点左侧所有值的总和,而不使用额外的整数指针参数,c++,c,pointers,data-structures,tree,C++,C,Pointers,Data Structures,Tree,给定一个二叉树,我需要将每个节点中的值更改为节点左侧节点中所有值的总和。本质上,每个节点的值应等于该节点之前访问的所有节点值的总和,以便遍历树。重要的一点是,必须在不使用整数指针参数的情况下执行此操作。我可以用整型指针参数来解决这个问题,这样来保持和。如果没有这个整数指针变量,当我从其父节点访问节点的右侧时,如何保持sum void modifyBST(struct node *root, int *sum) { if (root == NULL) return; // R

给定一个二叉树,我需要将每个节点中的值更改为节点左侧节点中所有值的总和。本质上,每个节点的值应等于该节点之前访问的所有节点值的总和,以便遍历树。重要的一点是,必须在不使用整数指针参数的情况下执行此操作。我可以用整型指针参数来解决这个问题,这样来保持和。如果没有这个整数指针变量,当我从其父节点访问节点的右侧时,如何保持sum

void modifyBST(struct node *root, int *sum) {

    if (root == NULL)  return;

    // Recur for right subtree
    modifyBSTUtil(root->left, sum);

    // Now *sum has sum of nodes in right subtree, add
    // root->data to sum and update root->data
    *sum = *sum + root->data;
    root->data = *sum;

    // Recur for left subtree
    modifyBSTUtil(root->right, sum);
}
如何修改此方法以删除int*sum。 我的完整程序在这里

示例树: 示例树: 顺序:4251637 前订单:1 2 4 5 3 6 7 输出:4 6 11 12 18 21 28一种可能的解决方案:

换言之,您真正想做的是将每个节点的和设置为前一个节点的和+与该节点关联的值,即

noden->sum=noden-1->sum+noden->value

现在,您在访问noden时正在设置noden->sum,但遇到的问题是,如果不将noden-1->sum作为参数传递,您将无法轻松访问它。为了解决这个问题,我建议当您可以轻松访问noden-1->sum时,即当您访问noden-1时,设置noden->sum

一些C代码来说明我的意思

void modifyBST(struct node *curNode)
{
    struct node* next = treeSuccessor(curNode);
    if(next != NULL)
    {
        next->sum = curNode->sum + next->value;
        modifyBST(next);
    }
}
假设在为该节点调用modifyBST之前设置了
curNode->sum
,该值对第一个节点有效(因为其和正好等于其值),对所有其他节点归纳有效

您可以通过查找第一个节点(示例中的值为4的节点)来使用此方法,如有必要,将sum设置为其值,并使用该节点作为参数调用modifyBST


TreeSuccessor是一个相当知名的算法,如果需要,您可以在网上的许多地方找到它的伪代码。

我认为下面的代码应该可以很好地工作。我没有测试它,只是手动检查了一下

我希望这有助于:

int modifyBST(struct node *root) {

    if (root == NULL)  return 0;

    root->data += modifyBSTUtil(root->left);

    return (root->data + modifyBSTUtil(root->right));
}

由于指针参数变量
sum
从未更改,因此我们可以轻松地将其删除

int sum;

void modifyNode(struct node *root)
{
    if (!root) return;

    modifyNode(root->left);
    sum = root->data += sum;
    modifyNode(root->right);
}

void modifyTree(struct node *root)
{
    sum = 0, modifyNode(root);
}

使用以下语句调用函数:

modify(root,0);

完整实现:

“必须在不使用整数指针参数的情况下完成。”那么使用引用(
void modifyBST(struct node*root,int&sum)
)怎么样?你是在请求还是实际上是引用?C++是与C中的指针一样的…所以不应该使用引用,那么你必须通过返回值来累积<代码>和< /代码>。ῥεῖ : 我想到了,但当访问父节点的右侧节点时,如何使用递归将获得的和传递给父节点?我写不出那种逻辑。如果我要添加两个子代,那么我可以编写递归来返回两个子代并在父代添加。尝试向下传递到目前为止累积的总和并返回新的总和。
modify(root,0);