LC 538. 把二叉搜索树转换为累加树
题目描述
这是 LeetCode 上的 538. 把二叉搜索树转换为累加树 ,难度为 中等。
给出二叉搜索树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node
的新值等于原树中大于或等于 node.val
的值之和。
提醒一下, 二叉搜索树满足下列约束条件:
- 节点的左子树仅包含键小于节点键的节点。
- 节点的右子树仅包含键大于节点键的节点。
- 左右子树也必须是二叉搜索树。
示例 1:1
2
3输入:[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:1
2
3输入:root = [0,null,1]
输出:[1,null,1]
提示:
- 树中的节点数在 $[1, 100]$ 范围内。
- $0 <= Node.val <= 100$
- 树中的所有值均不重复 。
中序遍历
利用 BST
的中序遍历是有序 的特性,我们可以通过两次遍历 BST
来求解问题。
首先,通过一次遍历,计算出整棵树的节点总和 tot
,然后在中序遍历过程中,不断对 tot
进行更新,将其作为当前未遍历到的节点的总和,用于给当前节点赋值。
假设当前遍历到的节点为 x
(起始节点值为 t
),那么将节点更新为当前节点 tot
后,更新 tot = tot - t
。
这是常规的中序遍历做法,更进一步,如果将其中序遍历的顺序进行翻转(从「左中右」调整为「右中左」),则可实现一次遍历。
Java 代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14class Solution {
int tot = 0;
public TreeNode convertBST(TreeNode root) {
dfs(root);
return root;
}
void dfs(TreeNode root) {
if (root == null) return ;
dfs(root.right);
tot += root.val;
root.val = tot;
dfs(root.left);
}
}
C++ 代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class Solution {
public:
int tot = 0;
TreeNode* convertBST(TreeNode* root) {
dfs(root);
return root;
}
void dfs(TreeNode* root) {
if (root == nullptr) return;
dfs(root->right);
tot += root->val;
root->val = tot;
dfs(root->left);
}
};
Python 代码:1
2
3
4
5
6
7
8
9
10
11
12class Solution:
def convertBST(self, root: TreeNode) -> TreeNode:
tot = 0
def dfs(root):
nonlocal tot
if not root: return
dfs(root.right)
tot += root.val
root.val = tot
dfs(root.left)
dfs(root)
return root
TypeScript 代码:1
2
3
4
5
6
7
8
9
10
11
12function convertBST(root: TreeNode | null): TreeNode | null {
let tot = 0;
const dfs = function(root: TreeNode | null): void {
if (!root) return ;
dfs(root.right);
tot += root.val;
root.val = tot;
dfs(root.left);
}
dfs(root);
return root;
};
- 时间复杂度:$O(n)$
- 空间复杂度:$O(n)$
最后
这是我们「刷穿 LeetCode」系列文章的第 No.538
篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。
在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。
为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。
在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!