Convert Sorted Array to Binary Search Tree

递归解法

思路

数组的中点为根, 然后递归中点为界限的左边和右边的数组. 递归的写法跟常规稍有不同,就是要把根root先new出来,然后它的左节点接到递归左边部分的返回值,右节点接到递归右边部分的返回值,最后将root返回回去。这个模板在树的构造中非常有用.

复杂度

时间: 一次遍历 O(n) 空间栈 O(logn)

代码

    public TreeNode sortedArrayToBST(int[] num) {
        if (num == null || num.length == 0){
            return null;
        }
        return helper(num, 0, num.length - 1);
    }
    private TreeNode helper(int[] num, int start, int end){
        if (start > end){
            return null;
        }
        int mid = (start + end)/2;
        TreeNode node = new TreeNode(num[mid]);
        node.left = helper(num, start, mid-1);
        node.right = helper(num, mid + 1, end);
        return node;
    }

Convert Sorted List to Binary Search Tree

递归解法

思路

因为linkedlist与array不同, 无法快速的访问到中间的节点, 而linkedlist的排列顺序正好是树的中序遍历.思路是先将左子树递归, 然后将递归到底的root就是linkedlist的头结点, 然后linkedlist访问下一个节点. 然后递归右子树, 整个过程就是一个中序遍历的过程

复杂度

时间O(n) 空间栈O(logn)

代码

public TreeNode sortedListToBST(ListNode head) {
        if (head == null) {
            return null;
        }
        ArrayList<ListNode> res = new ArrayList<ListNode>();
        res.add(head);
        ListNode cur = head;
        int count = 0;
        while (cur != null) {
            cur = cur.next;
            count++;//找出链表的总个数
        }
        return helper(res, 0, count - 1);
    }
    public TreeNode helper(ArrayList<ListNode> res, int start, int end) {
        if (start > end) {
            return null;
        }
        int mid = (end + start) / 2;
        TreeNode left = helper(res, start, mid - 1);
        TreeNode root = new TreeNode(res.get(0).val);
        root.left = left;
        res.set(0, res.get(0).next);//指向链表的下一个元素 因为中序遍历 下一个要访问的点就是该点
        root.right = helper(res, mid + 1, end);
        return root;
    }

lpy1990
26 声望10 粉丝