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

京公网安备 11010502036488号