0538. 把二叉搜索树转换为累加树【中等】
1. 📝 题目描述
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
提醒一下,二叉搜索树满足下列约束条件:
- 节点的左子树仅包含键 小于 节点键的节点。
- 节点的右子树仅包含键 大于 节点键的节点。
- 左右子树也必须是二叉搜索树。
注意:本题和 1038. 从二叉搜索树到更大和树 相同
示例 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
示例 3:
txt
输入:root = [1,0,2]
输出:[3,3,2]1
2
2
示例 4:
txt
输入:root = [3,2,4,1]
输出:[7,9,4,10]1
2
2
提示:
- 树中的节点数介于
0和10^4之间。 - 每个节点的值介于
-10^4和10^4之间。 - 树中的所有值 互不相同。
- 给定的树为二叉搜索树。
2. 🎯 s.1 - 反序中序遍历
c
int sum;
void dfs(struct TreeNode* node) {
if (!node) return;
dfs(node->right);
sum += node->val;
node->val = sum;
dfs(node->left);
}
struct TreeNode* convertBST(struct TreeNode* root) {
sum = 0;
dfs(root);
return root;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
js
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
var convertBST = 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
py
class Solution:
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
self.total = 0
def dfs(node):
if not node:
return
dfs(node.right)
self.total += node.val
node.val = self.total
dfs(node.left)
dfs(root)
return root1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
- 时间复杂度:
- 空间复杂度:
算法思路:
- 反序中序遍历(右-根-左),维护累加和
- 每个节点的新值 = 原值 + 所有比它大的节点的值之和