本题我给想复杂了,其实思路并不难,只需要通过反向中序遍历(右中左),然后进行顺序累加就可以了。相当于把二叉搜索树看做一个从大到小的数组,然后从数组的头个元素对数组进行累加操作。注意,本题使用两个指针,pre用来记录前一个节点的累加值,cur指针用来修改当前节点的值,并将修改后的值赋予pre指针。
递归法代码如下:
class Solution {
public:
int pre = 0;
void traversal(TreeNode* root) {
if(root == nullptr) return;
traversal(root->right);
root->val += pre;
pre = root->val;
traversal(root->left);
}
TreeNode* convertBST(TreeNode* root) {
pre = 0;
traversal(root);
return root;
}
};