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

replace each node of a tree with sum of all values in left side of the node without using extra integer pointer argument

本文关键字:节点 参数 指针 整数 替换      更新时间:2023-10-16

给定一棵二叉树,我需要将每个节点中的值更改为节点左侧节点中所有值的总和。从本质上讲,每个节点的值应该等于在树的有序遍历中先前访问过该节点的所有节点值的总和。重要的一点是,这个必须在不使用整型指针参数的情况下完成。我可以用整数指针参数来解决它,以保持这样的总和。如果没有这个整数指针变量,当我从父节点访问节点的右侧时,我该如何保存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可以被删除。我的完整程序在这里点击这里

树例子:树的例子:顺序:4 2 5 1 6 3 7预订:1、2、4、5、3、6、7输出:4 6 11 12 18 21 28

int modify(struct node* node,int sum)
{
     if (node == NULL)
          return 0;
     int l=modify(node->left,sum);
     int r=modify(node->right,sum+l+node->data);
     int x=node->data;
     node->data=node->data+l+sum;
     return x+l+r;
}

使用语句调用函数:

modify(root,0);

完全实现:http://ideone.com/A3ezlk

一个可能的解决方案:

换句话说,你真正想做的是将每个节点的和设置为前一个节点的和+与该节点相关的值,即

<<p>节点子> n ->和<子> n - 1子> <子> +节点n -> 价值

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

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

void modifyBST(struct node *curNode)
{
    struct node* next = treeSuccessor(curNode);
    if(next != NULL)
    {
        next->sum = curNode->sum + next->value;
        modifyBST(next);
    }
}

假设curNode->sum在对该节点调用modifyBST之前已经设置,这对第一个节点有效(因为它的和刚好等于它的值),并且对所有其他节点归纳有效。

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

treessuccessor是一个相当有名的算法,如果你需要的话,你可以在网上很多地方找到它的伪代码。

我认为下面的代码应该可以正常工作。我没有测试过,只是手工检查过。

我希望这对你有帮助:

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