开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的31天,点击查看活动详情
题目:LeetCode
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
提醒一下,二叉搜索树满足下列约束条件:
- 节点的左子树仅包含键 小于 节点键的节点。
- 节点的右子树仅包含键 大于 节点键的节点。
- 左右子树也必须是二叉搜索树。
示例 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]
示例 3:
输入: root = [1,0,2]
输出: [3,3,2]
示例 4:
输入: root = [3,2,4,1]
输出: [7,9,4,10]
提示:
- 树中的节点数介于
0和 之间。 - 每个节点的值介于 和 之间。
- 树中的所有值 互不相同 。
- 给定的树为二叉搜索树。
解题思路
二叉搜索树的特点是左子节点值小于(或等于)根节点,根节点小于(或者等于)右子节点。 那么,如果按照中序(左,中,右)顺序遍历的话,得到的是会是一个从小到大排好序的列表。
题目要求,把一个节点值换成 大于或者 等 于此节点值的累加和,就是此节点右边的所有的节点值的累加和。 正常中序遍历,遍历到当前节点时,能知道 的是 小于此节点的所有节点的累加和,那么假如知道整个树所有节点之和,再 减去 到此遍历到此节点的累加和,结果就是大于等 于此节点的累加和。
以中序的逆序来遍历二叉搜索树,这个问题,只需要 遍历一遍 就可以解决
代码实现
class Solution {
public TreeNode convertBST(TreeNode root) {
int sum = 0;
Stack < TreeNode > stack = new Stack < > ();
TreeNode curr = root;
while (curr != null || !stack.isEmpty()) {
while (curr != null) {
stack.push(curr);
curr = curr.right;
}
TreeNode node = stack.pop();
sum += node.val;
node.val = sum;
curr = node.left;
}
return root;
}
}
运行结果
复杂度分析
- 空间复杂度:
- 时间复杂度:
在掘金(JUEJIN) 一起分享知识, Keep Learning!