[leetcode #897] Increasing Order Search Tree


Problem


Given the root of a binary search tree, rearrange the tree in in-order so that the leftmost node in the tree is now the root of the tree, and every node has no left child and only one right child.
Example 1:
Input: root = [5,3,6,2,4,null,8,1,null,null,null,7,9]
Output: [1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]
Example 2:
Input: root = [5,1,7]
Output: [1,null,5,null,7]
Constraints:
· The number of nodes in the given tree will be in the range [1, 100].
· 0 <= Node.val <= 1000

Idea


問題は、所与のBSTを左ノードの順に並べ替えることである.再配置されたツリーには、左側のサブノードは含まれず、右側のサブノードのみが含まれます.
左側のノードから順番に並べる必要があるので、BSTを順番にブラウズします.inorderナビゲーションを使用して、リストにノードを追加し、inorderナビゲーションが終了したら、リスト順にツリーを作成します.
リストがあるかどうか、探るために木を作る方法もあるので、考えてみましょう!

Solution

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    List<TreeNode> list = new ArrayList<>();

    public TreeNode increasingBST(TreeNode root) {
        traverseBST(root);

        TreeNode res = list.remove(0);
        res.left = null;
        res.right = null;
        TreeNode cur = res;

        while (!list.isEmpty()) {
            TreeNode node = list.remove(0);
            node.left = null;
            node.right = null;
            cur.right = node;
            cur = node;
        }

        return res;
    }

    private void traverseBST(TreeNode node) {
        if (node == null) {
            return;
        }

        traverseBST(node.left);
        list.add(node);
        traverseBST(node.right);
    }
}

Reference


https://leetcode.com/problems/increasing-order-search-tree/