来源

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/increasing-order-search-tree/

描述

给定一个树,按中序遍历重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。

示例:
输入:[5,3,6,2,4,null,8,1,null,null,null,7,9]

  1. 5<br /> / \<br /> 3 6<br /> / \ \<br /> 2 4 8<br /> / / \<br />1 7 9

输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]
1
\
2
\
3
\
4
\
5
\
6
\
7
\
8
\
9
提示:
给定树中的结点数介于 1 和 100 之间。
每个结点都有一个从 0 到 1000 范围内的唯一整数值。

题解

中序遍历 + 构造新树

中序遍历,可以从小到大得到树上的节点。将这些节点对应的值(已经有序)存放在数组中,然后构造新树。

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. class Solution {
  11. public TreeNode increasingBST(TreeNode root) {
  12. List<Integer> vals = new ArrayList<>();
  13. TreeNode ans = new TreeNode(0), cur = ans;
  14. inorder(root, vals);
  15. for (int val : vals) {
  16. cur.right = new TreeNode(val);
  17. cur = cur.right;
  18. }
  19. return ans.right;
  20. }
  21. public void inorder(TreeNode node, List<Integer> vals) {
  22. if (null == node) return;
  23. inorder(node.left, vals);
  24. vals.add(node.val);
  25. inorder(node.right, vals);
  26. }
  27. }

复杂度分析

  • 时间复杂度:O(N),其中N是树上的节点个数。
  • 空间复杂度:O(N)。

中序遍历 + 更改树的连接方式

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. class Solution {
  11. TreeNode cur;
  12. public TreeNode increasingBST(TreeNode root) {
  13. TreeNode ans = new TreeNode(0);
  14. cur = ans;
  15. inorder(root);
  16. return ans.right;
  17. }
  18. public void inorder(TreeNode node) {
  19. if (null == node) return;
  20. inorder(node.left);
  21. node.left = null;
  22. cur.right = node;
  23. cur = node;
  24. inorder(node.right);
  25. }
  26. }

复杂度分析

  • 时间复杂度:O(N),其中N是树上的节点个数。
  • 空间复杂度:O(H),其中H是树的高度。