题目描述
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
提醒一下,二叉搜索树满足下列约束条件:
- 节点的左子树仅包含键 小于 节点键的节点。
- 节点的右子树仅包含键 大于 节点键的节点。
- 左右子树也必须是二叉搜索树。
解题思路
- 逆中序遍历:
- 反向中序遍历(右→根→左)
- 按降序访问节点值
- 累加机制:
- 维护全局累加变量 sum
- 每个节点新值 = 原值 + 当前 sum
- 更新 sum = 新节点值
- 递归实现:
- 先递归右子树
- 处理当前节点
- 再递归左子树
- 就地修改:
- 直接在原树节点更新值
- 无需创建新树
关键洞察
- 降序访问原理:
- BST特性:右子树值 > 根值 > 左子树值
- 右子树优先访问保证降序遍历
- 累加传递性:
- 大值节点先被访问并累加
- 小值节点继承大值累加结果
- 状态维护:
- 全局 sum 记录已访问节点值总和
- 每个节点只需访问一次
- 无新树创建:
- 直接修改节点值
- 保持原树结构不变
复杂度分析
| 指标 | 说明 |
|---|---|
| 时间复杂度 | O(n):每个节点访问一次 |
| 空间复杂度 | O(h):递归栈深度(h为树高,最坏O(n)) |
代码实现
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
var convertBST = function (root) {
const stack = [];
let sum = 0;
let node = root;
while (stack.length || node) {
while (node) {
stack.push(node);
node = node.right
}
node = stack.pop();
sum += node.val;
node.val = sum;
node = node.left;
}
return root;
};
相似题目
- 无