/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
#include <algorithm>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return TreeNode类
     */
    int max = 1;
    void fxxkDfs(TreeNode* root){
        if(root == NULL) return ;
        //反中序遍历
        max = std::max(max,root->val);
        fxxkDfs(root->right);
        if(root->val < max){
            root->val += max;
            max = std::max(max,root->val);
        }
        fxxkDfs(root->left);
    }
    TreeNode* convertBST(TreeNode* root) {
        // write code here
        if (root == NULL) {
            return nullptr;
        }
        fxxkDfs(root);
        return root;
    }
};

树怎么累加?

哎!这是二叉搜索树!是有序的!

转换成数组不就行了!

有序的元素如果求累加呢?

其实这就是一棵树,大家可能看起来有点别扭,

换一个角度来看,这就是一个有序数组[2, 5, 13],

求从后到前的累加数组,也就是[20, 18, 13],是不是感觉这就简单了。

算法思想:

该算法采用反中序遍历的方式遍历二叉搜索树,对每个节点进行更新。具体来说,对于每个节点,它首先遍历右子树,然后检查当前节点的值是否小于已经遍历过的最大值。如果是,则将当前值加上最大值,并将最大值更新为新的值。最后,它遍历左子树。最终,整个二叉搜索树的节点值都被更新为更大的值。

时间复杂度:

遍历整个二叉搜索树,时间复杂度为O(n),其中n为节点数。

空间复杂度:

递归调用的栈空间为O(h),其中h为二叉搜索树的高度。最坏情况下,当二叉搜索树为链表时,h=n,空间复杂度为O(n)。最好情况下,当二叉搜索树为平衡树时,h=logn,空间复杂度为O(logn)。