给你一棵二叉搜索树的 root ,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。

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

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

    输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]

    1. 1
    2. \
    3. 2
    4. \
    5. 3
    6. \
    7. 4
    8. \
    9. 5
    10. \
    11. 6
    12. \
    13. 7
    14. \
    15. 8
    16. \
    17. 9


    示例 2:
    输入:root = [5,1,7]
    输出:[1,null,5,null,7]

    二叉搜索树的中序遍历结果是一个升序的有序序列
    遍历有序序列,构建一个只有右子节点的树

    1. public TreeNode increasingBST(TreeNode root) {
    2. List<Integer> valList = new ArrayList<>();
    3. inOrder(root,valList);
    4. // 中序遍历结果第一个元素作为新的树的根节点
    5. TreeNode newRoot = new TreeNode(valList.get(0));
    6. // 借用一个临时节点对象作为下一个节点的父节点
    7. TreeNode preNode = newRoot;
    8. for (int i = 1; i < valList.size(); i++) {
    9. // 创建一个新节点
    10. TreeNode node = new TreeNode(valList.get(i));
    11. // 将当前节点设置为上一个节点的右子节点
    12. preNode.right = node;
    13. // 将当前节点设置为下一个节点的父节点
    14. preNode = node;
    15. }
    16. return newRoot;
    17. }
    18. /**
    19. * 二叉搜索树的中序遍历结果是个有序数组
    20. *
    21. * @param node
    22. * @param valList
    23. */
    24. private void inOrder(TreeNode node, List<Integer> valList) {
    25. if (node == null) {
    26. return;
    27. }
    28. inOrder(node.left, valList);
    29. valList.add(node.val);
    30. inOrder(node.right, valList);
    31. }