输入: 二叉搜索树根节点 root(节点值各不相同)。
要求: 将其转换为累加树(Greater Sum Tree):
每个节点的新值 = 原树中所有 大于等于该节点值 的节点值之和。
输出: 转换后的树根节点 TreeNode*(原地修改后返回 root)。
思路:
BST 的中序遍历(左-根-右)是递增序列。
那我们如果想做“后缀和”(从大到小累加),就把遍历方向反过来:
逆向中序遍历:右 -> 根 -> 左
访问顺序从大到小,维护一个滚动累加sum。
遍历到某个节点时:
- 先走右子树(更大的值先处理)
sum += node->valnode->val = sum(把当前节点改成“>= 自己的总和”)- 再走左子树
补充:
也能用“两次正序中序”做:第一次中序存有序数组并做后缀和映射,第二次再中序回填。
但那是 O(N) 额外空间;本题一趟逆向中序就能原地搞定。
复杂度:
- 时间复杂度:O(N)
- 空间复杂度:O(H)(递归栈,H 为树高)
class Solution {
public:
TreeNode* convertBST(TreeNode* root) {
sum = 0;
reverseInorder(root);
return root;
}
private:
int sum;
void reverseInorder(TreeNode* node) {
if (node == nullptr) return;
reverseInorder(node->right);
sum += node->val;
node->val = sum;
reverseInorder(node->left);
}
};
2351

被折叠的 条评论
为什么被折叠?



