1. 程式人生 > 其它 >通過有序陣列生成平衡搜尋二叉樹 & 有序連結串列轉換二叉搜尋樹(力扣)

通過有序陣列生成平衡搜尋二叉樹 & 有序連結串列轉換二叉搜尋樹(力扣)

通過有序陣列生成平衡搜尋二叉樹

題目:將有序陣列轉換為二叉搜尋樹

《程式設計師程式碼面試指南》第46題 P152 難度:士★☆☆☆

通過陣列生成很簡單,只需要用有序陣列最中間的數生成搜尋二叉樹的頭節點,然後其左邊右邊的數分別作為頭節點的左子樹右子樹即可,然後再往下遞迴,最終生成整棵二叉樹。

public Node generateTree(int[] sortArr) {
    if (sortArr == null) {
        return null;
    }
    return generate(sortArr, 0, sortArr.length - 1);
}

public Node generate(int[] sortArr, int start, int end) {
    if (start > end) {
        return null;
    }
    int mid = (start + end) / 2;
    Node head = new Node(sortArr[mid]);
    head.left = generate(sortArr, start, mid - 1);
    head.right = generate(sortArr, mid + 1, end);
    return head;
}

有序連結串列轉換二叉搜尋樹

題目:有序連結串列轉換二叉搜尋樹

力扣第109題 難度:中等

和上題一樣,同樣是用中間節點作為二叉樹的根節點,左右邊作為其左右子樹。不過連結串列不好直接用索引很方便的訪問,而且單向連結串列也不好向前遍歷。因此思路不完全一樣。

官方題解有序連結串列轉換二叉搜尋樹——題解

兩種方法都是分治法(雖然沒學過,不過大概是那個意思)。

方法一通過快慢指標來定位中間節點,時間複雜度O(nlogn),空間複雜度:

class Solution {
    public TreeNode sortedListToBST(ListNode head) {
        return buildTree(head, null);
    }

    public TreeNode buildTree(ListNode left, ListNode right) {
        if (left == right) {
            return null;
        }
        ListNode mid = getMedian(left, right);
        TreeNode root = new TreeNode(mid.val);
        root.left = buildTree(left, mid);
        root.right = buildTree(mid.next, right);
        return root;
    }

    public ListNode getMedian(ListNode left, ListNode right) {
        ListNode fast = left;
        ListNode slow = left;
        while (fast != right && fast.next != right) {
            fast = fast.next;
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
    }
}

作者:LeetCode-Solution
連結:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/solution/you-xu-lian-biao-zhuan-huan-er-cha-sou-suo-shu-1-3/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

方法二分治+中序遍歷優化,將這兩者結合起來,時間複雜度O(n),空間複雜度:

class Solution {
    ListNode globalHead;

    public TreeNode sortedListToBST(ListNode head) {
        globalHead = head;
        int length = getLength(head);
        return buildTree(0, length - 1);
    }

    public int getLength(ListNode head) {
        int ret = 0;
        while (head != null) {
            ++ret;
            head = head.next;
        }
        return ret;
    }

    public TreeNode buildTree(int left, int right) {
        if (left > right) {
            return null;
        }
        int mid = (left + right + 1) / 2;
        TreeNode root = new TreeNode();
        root.left = buildTree(left, mid - 1);
        root.val = globalHead.val;
        globalHead = globalHead.next;
        root.right = buildTree(mid + 1, right);
        return root;
    }
}

作者:LeetCode-Solution
連結:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/solution/you-xu-lian-biao-zhuan-huan-er-cha-sou-suo-shu-1-3/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。