题意
给一个BST,改变其节点的值,将其节点的值加上所有比他大的节点的值
思路
首先注意是BST,其中序遍历的节点是递增序列。即假设中序遍历后的结果是 a0,a1,a2,....an ,我们有 a0<a1<a2<...<an 。
那么对于 ai ,其改变后的值应该是 ai+ai+1+ai+2+...+an ,即我们只需要将 ai 之后遍历的节点值累加起来即可。为了达到这个效果,我们只需要将中序遍历的顺序倒过来: an,an−1,...,a2,a1,a0 ,对于 ai ,只需要累加上其之前遍历过的节点值即可。
所以,我们只需要右,根,左的去遍历节点,并且遍历到根节点时,累加上之前遍历过的节点值即可。
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int sum = 0;
void dfs(TreeNode* root) {
if (!root) return;
dfs(root->right);
sum += root->val;
root->val = sum;
dfs(root->left);
}
TreeNode* convertBST(TreeNode* root) {
dfs(root);
return root;
}
};