题目描述:
给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
例如:
输入: 原始二叉搜索树:
5
/ \
2 13
输出: 转换为累加树:
18
/ \
20 13
思路:
按照节点值降序遍历所有节点, 同时记录我们已经遍历过的节点值的和,并把这个和加到当前节点的值中。这种遍历树的方法被称作 反序中序遍历
每个节点只遍历一次:时间复杂度 O(n)
空间复杂度: O(n)
使用之前的结论 convertBST 会被调用线性次,我们可以知道整个算法的空间复杂度也是线性的。考虑最坏情况,一棵树只有右子树(或者只有左子树),调用栈会一直增长直到到达叶子节点,也就是包含 n 个节点。
int sum = 0;
public TreeNode convertBST(TreeNode root) {
if (root == null) {
return null;
}
//遍历右子树
convertBST(root.right);
//遍历顶点
root.val = root.val + sum;
sum = root.val;
//遍历左子树
convertBST(root.left);
return root;
}