🚩传送门:力扣题目

题目

给出二叉搜索树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree)。

示例 1:
[LC]538. 把二叉搜索树转换为累加树 - 图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]

解题思路:递归

使用 后续遍历 ,用 [LC]538. 把二叉搜索树转换为累加树 - 图2 记录前项的累加和,当前结点等于 [LC]538. 把二叉搜索树转换为累加树 - 图3,接着使用 [LC]538. 把二叉搜索树转换为累加树 - 图4更新 [LC]538. 把二叉搜索树转换为累加树 - 图5 ,完成后续的递归遍历计算

复杂度分析

时间复杂度:[LC]538. 把二叉搜索树转换为累加树 - 图6,其中 [LC]538. 把二叉搜索树转换为累加树 - 图7 是二叉搜索树的节点数。每一个节点恰好被遍历一次。

空间复杂度:[LC]538. 把二叉搜索树转换为累加树 - 图8,为递归过程中栈的开销,平均情况下为[LC]538. 把二叉搜索树转换为累加树 - 图9,最坏情况下树呈现链状,为 [LC]538. 把二叉搜索树转换为累加树 - 图10

官方代码

  1. class Solution {
  2. int pre = 0;
  3. public TreeNode convertBST(TreeNode root) {
  4. if (root == null) return root;
  5. pre = 0;
  6. convertBST_(root);
  7. return root;
  8. }
  9. public void convertBST_(TreeNode root) {
  10. if(root==null)return;
  11. convertBST_(root.right);
  12. root.val += pre;
  13. pre = root.val;
  14. convertBST_(root.left);
  15. }
  16. }