力扣(LeetCode)1038. 从二叉搜索树到更大和树(C++)
先序遍历
根据题意,给定一个二叉搜索树 root (BST),请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。模拟二叉搜索树替换到更大和数的过程,
请了解性质:二叉搜索树的先序遍历,是一个正序数组
直观思路,先序遍历(左根右)得到正序数组,再反向先序遍历(右根左)二叉搜索树,根据正序数组倒着累加在树上。
请思考:反向先序遍历(右根左)二叉搜索树的结果,正是二叉搜索树的逆序数组,提示我们可以直接反向先序遍历遍历二叉搜索树,同时累加。
提示:累加的过程,是对二叉搜索树的逆序数组,做前缀和。
class Solution {
private:
int sum = 0;
public:
TreeNode* bstToGst(TreeNode* root) {
preOrderTraverse(root);
return root;
}
void preOrderTraverse(TreeNode *t_node) {
if (!t_node) return ;
if (t_node -> right) preOrderTraverse(t_node->right);
sum += t_node->val;
t_node->val = sum;
if (t_node -> left) preOrderTraverse(t_node->left);
}
};
时间复杂度
O
(
n
)
O(n)
O(n):反向先序遍历的时间复杂度
O
(
n
)
O(n)
O(n)。
空间复杂度
O
(
n
)
O(n)
O(n):最坏空间复杂度
O
(
n
)
O(n)
O(n)。
致语
- 欢迎读者在评论区留言,期待和大家交流做题感想,分享算法经验~