/** * 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)。