1038. 从二叉搜索树到更大和树【中等】
1. 📝 题目描述
给定一个二叉搜索树 root (BST),请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。
提醒一下, 二叉搜索树 满足下列约束条件:
- 节点的左子树仅包含键 小于 节点键的节点。
- 节点的右子树仅包含键 大于 节点键的节点。
- 左右子树也必须是二叉搜索树。
示例 1:

txt
输入:[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]1
2
2
示例 2:
txt
输入:root = [0,null,1]
输出:[1,null,1]1
2
2
提示:
- 树中的节点数在
[1, 100]范围内。 0 <= Node.val <= 100- 树中的所有值均 不重复。
注意:该题目与 538. 把二叉搜索树转换为累加树 相同
2. 🎯 s.1 - 反向中序遍历
js
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
var bstToGst = function (root) {
let sum = 0
const dfs = (node) => {
if (!node) return
dfs(node.right)
sum += node.val
node.val = sum
dfs(node.left)
}
dfs(root)
return root
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- 时间复杂度:
,其中 是二叉树的节点数 - 空间复杂度:
,递归调用栈的深度
算法思路:
- BST 的中序遍历是升序的,反向中序遍历(右-根-左)则是降序的
- 按降序遍历并维护累加和
sum,每个节点的新值即为当前累加和 - 遍历顺序:先右子树、再当前节点(累加并更新)、最后左子树