1038. 从二叉搜索树到更大和树
题目描述:
给定一个二叉搜索树 root
(BST),请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。
提醒一下, 二叉搜索树 满足下列约束条件:
- 节点的左子树仅包含键 小于 节点键的节点。
- 节点的右子树仅包含键 大于 节点键的节点。
- 左右子树也必须是二叉搜索树。
示例 1:
输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]
示例 2:
输入:root = [0,null,1]
输出:[1,null,1]
提示:
- 树中的节点数在
[1, 100]
范围内。 0 <= Node.val <= 100
- 树中的所有值均 不重复 。
注意: 该题目与 538: https://leetcode-cn.com/problems/convert-bst-to-greater-tree/ 🔗 相同
解题分析及思路:
方法:深度优先搜索
思路:
利用二叉搜索树的特点
- 节点的左子树仅包含键 小于 节点键的节点。
- 节点的右子树仅包含键 大于 节点键的节点。
那么,可以优先计算值大的节点,再计算值小的节点,那么显而易见,这实际上就是二叉树的中序遍历,只不过遍历顺序为[右子树、跟节点、左子树]
并且在遍历的过程中将值累计即可
func bstToGst(root *TreeNode) *TreeNode {
var sum int
var dfs func(root *TreeNode)
dfs = func(root *TreeNode) {
if root == nil {
return
}
dfs(root.Right)
sum += root.Val
root.Val = sum
dfs(root.Left)
}
dfs(root)
return root
}
复杂度:
- 时间复杂度:O(n)
- 空间复杂度:O(n)
执行结果:
- 执行耗时:0 ms,击败了100.00% 的Go用户
- 内存消耗:2.2 MB,击败了100.00% 的Go用户