我的正确代码:
class Solution {
public:
int curSum = 0;
TreeNode* convertBST(TreeNode* root) {
if (!root)
return nullptr;
order(root);
return root;
}
void order(TreeNode* root) {
if (!root)
return;
order(root->right);
curSum += root->val;
root->val = curSum;
order(root->left);
}
};
首先:
对于一个递增数组而言,要将每个元素置为大于等于它的元素之和,那么我们从右往左遍历,维护后缀和即可。
而对于二叉搜索树,有一个性质:中序遍历是递增的,那么反向中序遍历就是递减的。
所以我们反向中序遍历即可。
代码:
class Solution {
public:
int curSum = 0;
TreeNode* convertBST(TreeNode* root) {
dfs(root);
return root;
}
void dfs(TreeNode* root){
if(!root)
return;
dfs(root->right);
curSum+=root->val;
root->val = curSum;
dfs(root->left);
}
};