这个题挺巧妙,要将二叉搜索树的每个节点值替换成树中大于等于该节点值的所有节点值之和。
我们可以使用颠倒的中序遍历,即从二叉搜索树中最大的节点开始遍历:
用一个变量
sum
来存放累加和,因为是从大到小遍历,每次sum
累加当前节点的值后,再赋值给当前节点即可。
class Solution {
public:
TreeNode* convertBST(TreeNode* root) {
int sum = 0; //sum表示大于等于当前节点值的所有节点值之和
dfs(root, sum);
return root;
}
void dfs(TreeNode* root, int& sum)
{
if (root == nullptr) return;
dfs(root->right, sum);
sum += root->val; //累加当前节点值
root->val = sum; //再赋值给当前节点
dfs(root->left, sum);
}
};