Leetcode 109. 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.

題意:把一個(gè)有序的升序鏈表轉(zhuǎn)化為高度平衡的二叉搜索樹(shù)。

思路:
這道題把108的條件從數(shù)組改為了鏈表,鏈表相比于數(shù)組,求中點(diǎn)沒(méi)有那么方便,因此我們可以把它轉(zhuǎn)為化求數(shù)組。初始化一個(gè)List變量,然后遍歷鏈表,既能求出鏈表長(zhǎng)度,同時(shí)也能把鏈表的每個(gè)節(jié)點(diǎn)值映射到List上,然后應(yīng)用108的解法就可以了。

public TreeNode sortedListToBST(ListNode head) {
    if (head == null) {
        return null;
    }

    List<Integer> list = new ArrayList<>();
    int length = 0;
    ListNode dummy = head;
    while (dummy != null) {
        list.add(dummy.val);
        length++;
        dummy = dummy.next;
    }

    return helper(1, length, list);
}

public TreeNode helper(int start, int end, List<Integer> list) {
    if (start > end) {
        return null;
    }

    int middle = start + (end - start) / 2;
    TreeNode root = new TreeNode(list.get(middle));
    root.left = helper(start, middle - 1, list);
    root.right = helper(middle + 1, end, list);

    return root;
}

自己的這種解法空間復(fù)雜度是O(n),想看看有沒(méi)有O(1)的方法,想到每次通過(guò)快慢指針求終點(diǎn)的話,時(shí)間復(fù)雜度又很高,沒(méi)想到合適的方法。
看了discuss,發(fā)現(xiàn)了一個(gè)很巧妙的方法,利用中序遍歷的特點(diǎn),輔以一個(gè)游標(biāo)node初始化指向head,然后隨著中序遍歷每次右移一次,正好可以構(gòu)建出高度平衡的BST,十分精彩。

private ListNode node;

public TreeNode sortedListToBST(ListNode head) {
    if(head == null){
        return null;
    }

    int size = 0;
    ListNode runner = head;
    node = head;

    while(runner != null){
        runner = runner.next;
        size ++;
    }

    return inorderHelper(0, size - 1);
}

public TreeNode inorderHelper(int start, int end){
    if(start > end){
        return null;
    }

    int mid = start + (end - start) / 2;
    TreeNode left = inorderHelper(start, mid - 1);

    TreeNode treenode = new TreeNode(node.val);
    treenode.left = left;
    node = node.next;

    TreeNode right = inorderHelper(mid + 1, end);
    treenode.right = right;

    return treenode;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容