[Leetcode] Convert Sorted Array/List to Binary Search Tree 建BST

517 查看

Convert Sorted List to Binary Search Tree

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

递归法

复杂度

时间 O(N) 空间 O(H)

思路

建树比较方便的方法是递归,对于有序链表,高度平衡BST的根节点是其中点,然后该根节点的左子树的根节点,又是左半边的中点,该根节点的右子树的根节点,又是右半边的中点,以此往复,链表第一个节点,就是最左边左子树的根节点,而最左边左子树的左节点和右节点都是空。我们可以用start和end两个值来限定子树在链表中的位置,通过递归的方式,实际上可以实现顺序遍历链表然后建树的过程。不过java中,需要将链表当前遍历到节点作为全局变量,保证递归过程中链表也是顺序遍历的。

代码

public class Solution {
    
    ListNode curr;
    
    public TreeNode sortedListToBST(ListNode head) {
        curr = head;
        int len = 0;
        // 先计算出链表的长度
        while(head != null){
            head = head.next;
            len++;
        }
        // 开始建树
        return buildTree(0, len - 1);
    }
    
    private TreeNode buildTree(int start, int end){
        // 如果start>end,说明子树已经小到没有节点了,直接返回null
        if(start > end){
            return null;
        }
        // 找到中点
        int mid = start + (end - start) / 2;
        // 先递归的计算左子树
        TreeNode left = buildTree(start, mid - 1);
        // 然后建立根节点
        TreeNode root = new TreeNode(curr.val);
        // 链表顺序遍历
        curr = curr.next;
        // 最后计算右子树
        TreeNode right = buildTree(mid + 1, end);
        // 将三个节点连接起来
        root.left = left;
        root.right = right;
        return root;
    }
}

Convert Sorted Array to Binary Search Tree

Given an array where elements are sorted in ascending order, convert it to a height balanced BST.

递归法

复杂度

时间 O(N) 空间 O(H)

思路

和用链表建树的思路相似,实现更加简单,因为数组支持随机查询,我们可以直接访问中点而无须遍历链表。

代码

public class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return buildTree(nums, 0, nums.length - 1);
    }
    
    private TreeNode buildTree(int[] nums, int start, int end){
        if(start > end){
            return null;
        }
        int mid = start + (end - start) / 2;
        // 先递归的计算左子树
        TreeNode left = buildTree(nums, start, mid - 1);
        // 创造根节点
        TreeNode root = new TreeNode(nums[mid]);
        // 最后递归的计算右子树
        TreeNode right = buildTree(nums, mid + 1, end);
        root.left = left;
        root.right = right;
        return root;
    }
}