题意
给一个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;
}
};

本文介绍了一种特殊的二叉搜索树(BST)转换方法,通过改变节点值使其等于该节点及其右侧所有节点值之和。利用BST的性质进行逆中序遍历,实现了简洁高效的算法。
375

被折叠的 条评论
为什么被折叠?



