1. 题目描述

给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。

例如:

  1. 输入: 原始二叉搜索树:
  2. 5
  3. / \
  4. 2 13
  5. 输出: 转换为累加树:
  6. 18
  7. / \
  8. 20 13

2. 解题思路

我们都知道二叉树的中序遍历结果是一个递增的数组。这里我们可以进行倒序进行中序遍历,这样遍历的出的数组就是递减的。

中序遍历的顺序是 左子树→根节点→右子树

所以可以先遍历右子树,再遍历根节点,最后遍历左子树。

这样的话,设置一个节点不断累加之前的值,那么在当前节点的值就会赋值成比他大的数的和。

3. 代码实现

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val) {
  4. * this.val = val;
  5. * this.left = this.right = null;
  6. * }
  7. */
  8. /**
  9. * @param {TreeNode} root
  10. * @return {TreeNode}
  11. */
  12. var convertBST = function(root) {
  13. let sum = 0
  14. const inOrder = (root) => {
  15. if(!root){
  16. return
  17. }
  18. if(root.right){
  19. inOrder(root.right)
  20. }
  21. sum += root.val
  22. root.val = sum
  23. if(root.left){
  24. inOrder(root.left)
  25. }
  26. }
  27. inOrder(root)
  28. return root
  29. };

4. 提交结果

538. 把二叉搜索树转换为累加树 - 图1