📜  门| GATE-CS-2016(套装1)|第 60 题(1)

📅  最后修改于: 2023-12-03 15:28:44.896000             🧑  作者: Mango

题目60:完整的二叉搜索树

题目描述:

给定1到n的整数序列,将它们按中序遍历的顺序放入一棵完整的二叉搜索树中。在该树中,根节点的值为左子树中的最大值,右子树中的最小值。

输入格式:

第一行包含一个整数n,表示整数序列的长度。

输出格式:

一行空格分隔的n个整数,表示按中序遍历顺序放入完整的二叉搜索树后的结果。

示例:

输入:

3

输出:

2 1 3
题解:

由于要构成一棵完整的二叉树,根节点需要分别取到左右子树的中位数,然后分别递归构造左右子树。

先考虑如何求出中位数,显然当n为偶数时,不同的中位数有两个,此处取其中一个即可。

int mid = (left + right) / 2;

然后就可以递归构造左右子树了,具体实现参见代码。

public class Solution {

    public TreeNode sortedListToBST(int[] nums) {
        return build(nums, 0, nums.length - 1);
    }

    private TreeNode build(int[] nums, int left, int right) {
        if (left > right) {
            return null;
        }

        int mid = (left + right) / 2;

        TreeNode root = new TreeNode(nums[mid]);

        root.left = build(nums, left, mid - 1);
        root.right = build(nums, mid + 1, right);

        return root;
    }
}

时间复杂度为O(n),空间复杂度为O(logn)。