Every day a Leetcode
题目来源:1038. 从二叉搜索树到更大和树
解法1:中序遍历
观察示例 1,我们发现了规律:
二叉搜索树的中序遍历是一个单调递增的有序序列。
本题中要求我们将每个节点的值修改为原来的节点值加上所有大于它的节点值之和。这样我们只需要反序中序遍历该二叉搜索树,记录过程中的节点值之和,并不断更新当前遍历到的节点的节点值,即可得到题目要求的累加树。
代码:
/*
* @lc app=leetcode.cn id=1038 lang=cpp
*
* [1038] 从二叉搜索树到更大和树
*/
// @lc code=start
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution
{
private:
int sum = 0;
public:
TreeNode *bstToGst(TreeNode *root)
{
if (root)
{
bstToGst(root->right);
sum += root->val;
root->val = sum;
bstToGst(root->left);
}
return root;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中 n 是二叉搜索树的节点数。每一个节点恰好被遍历一次。
空间复杂度:O(logn),其中 n 是二叉搜索树的节点数。为递归过程中栈的开销,等于二叉树的高度,最差为 O(n)。