将树的每个节点替换为节点左侧所有值的和,而不使用额外的整数指针参数
replace each node of a tree with sum of all values in left side of the node without using extra integer pointer argument
给定一棵二叉树,我需要将每个节点中的值更改为节点左侧节点中所有值的总和。从本质上讲,每个节点的值应该等于在树的有序遍历中先前访问过该节点的所有节点值的总和。重要的一点是,这个必须在不使用整型指针参数的情况下完成。我可以用整数指针参数来解决它,以保持这样的总和。如果没有这个整数指针变量,当我从父节点访问节点的右侧时,我该如何保存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);
}
集成- 节点插件 API 将数组作为函数参数传递
- 无法使用类型为"结构节点 *"的左值初始化类型为"结构节点 *"的参数
- 在没有参数列表的情况下无效使用模板名称"节点"
- C 指针节点帮助 - 将参数复制到链接的列表节点更改该节点的不同部分
- 用一个参数计数圆形链接列表中的节点
- 我不知道如何调用参数为节点类型的函数
- 从GCC功能树节点中检索函数参数
- 无法将参数从"this"转换为节点<T>*
- 无法在函数调用之外更改节点参数
- 节点C++插件 - 当类型数组(Float32Array)作为参数传递时,如何访问它?
- C++数据流编程:使用不同的模板参数互连节点
- "节点":使用类模板需要模板参数列表
- 序遍历的二叉搜索树,没有节点指针作为参数
- 将树的每个节点替换为节点左侧所有值的和,而不使用额外的整数指针参数
- c++如何从具有多个参数的节点中检索信息
- 面试编码-将指向节点结构的指针作为参数,并返回传入数据结构的完整副本
- 为什么我得到错误,模板参数需要'结构节点'
- 检查传递给节点c++插件的参数是否为Infinity或NaN
- C++参数 1 没有从"节点*"到"节点*&"的已知转换
- 使用c++引用参数在链表中分配新节点