题目描述

🔗
image.png

解题思路

那么有序的元素如果求累加呢?
其实这就是一棵树,大家可能看起来有点别扭,换一个角度来看,这就是一个有序数组[2, 5, 13],求从后到前的累加数组,也就是[20, 18, 13],是不是感觉这就简单了。
为什么变成数组就是感觉简单了呢?
因为数组大家都知道怎么遍历啊,从后向前,挨个累加就完事了,这换成了二叉搜索树,看起来就别扭了一些是不是。
那么知道如何遍历这个二叉树,也就迎刃而解了,从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了
也就是反中序遍历,在依次累加,注意使用pre来记录上一个节点。

递归法

  1. /**
  2. * 递归法
  3. *
  4. * @param root
  5. * @return
  6. */
  7. public TreeNode convertBST(TreeNode root) {
  8. return traversal(root);
  9. }
  10. int pre = 0; // 记录上一个节点的值
  11. // 反中序遍历(右左中)
  12. public TreeNode traversal(TreeNode root) {
  13. if (root == null) return null;
  14. traversal(root.right);
  15. root.val += pre;
  16. pre = root.val;
  17. traversal(root.left);
  18. return root;
  19. }

迭代法

  1. /**
  2. * 迭代法
  3. *
  4. * @param root
  5. * @return
  6. */
  7. public TreeNode convertBST(TreeNode root) {
  8. if (root == null) return null;
  9. Stack<TreeNode> stack = new Stack<>();
  10. TreeNode cur = root;
  11. int pre = 0;
  12. while (cur != null || !stack.isEmpty()) {
  13. if (cur != null) {
  14. stack.push(cur);
  15. cur = cur.right;
  16. }else {
  17. cur = stack.pop();
  18. cur.val += pre;
  19. pre = cur.val;
  20. cur = cur.left;
  21. stack.push(cur);
  22. }
  23. }
  24. return root;
  25. }