1. 程式人生 > >有序鏈表轉換二叉搜索樹

有序鏈表轉換二叉搜索樹

樹的高度 有序數組 方法 ati 元素 vat static www pos

問題描述:

給定一個單鏈表,其中的元素按升序排序,將其轉換為高度平衡的二叉搜索樹。

本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。

示例:

給定的有序鏈表: [-10, -3, 0, 5, 9],

一個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜索樹:

      0
     /    -3   9
   /   /
 -10  5

解題思路:

將鏈表先轉為數組,之後方法與將有序數組轉換為二叉搜索樹相同。

實現代碼:

    private static TreeNode test(int[] nums, int
lo, int hi) { if (lo < hi) return null; if (lo == hi) return new TreeNode(nums[hi]); int mid = (lo + hi) / 2; TreeNode node = new TreeNode(nums[mid]); node.left = test(nums, lo, mid-1); node.right = test(nums, mid+1, hi); return node; }
public static TreeNode listToBST(ListNode head) { // 將鏈表轉為數組 ListNode temp = head; int len = 0; while (temp != null) { len++; temp = temp.next; } int[] nums = new int[len]; temp = head; len = 0; while (temp != null
) { nums[len++] = temp.val; temp = temp.next; } return test(nums, 0, nums.length); }

方法2:

直接使用鏈表生成二叉搜索樹。

在遞歸生成二叉樹時,先求左子樹,再根節點,最後右子樹。

實現代碼:

    private static TreeNode build(int lo, int hi) {

        if (lo > hi) return null;

        int mid = (lo + hi) / 2;
        // 先求左子樹
        TreeNode left = build(lo, mid-1);

        // 構造節點
        TreeNode node = new TreeNode(list.val);
        list = list.next;

        // 右子樹
        TreeNode right = build(mid+1, hi);

        node.left = left;
        node.right = right;
        if (mid == (len-1)/2) root = node;
        return node;
    }
    public static TreeNode toBST(ListNode head) {
        // 計算鏈表總長度
        list = head;
        while (head != null) {
            len++;
            head = head.next;
        }
        build(0, len-1);
        return root;
    }

有序鏈表轉換二叉搜索樹