LeetCode系列之「有序連結串列轉換二叉搜尋樹」

HoryChang發表於2020-09-25

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

給定一個單連結串列,其中的元素按升序排序,將其轉換為高度平衡的二叉搜尋樹。

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

示例

給定的有序連結串列: [-10, -3, 0, 5, 9],

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

      0
     / \
   -3   9
   /   /
 -10  5

思路:分治思想

快慢指標找出中間節點mid,將中間節點作為樹的根節點。

斷開mid前後指標,至於前指標,我們要維護一個slow的前節點。所以還要建立一個虛節點。

找出中節點mid後,對於左邊和右邊進行相同的操作。

Java實現如下

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode sortedListToBST(ListNode head) {
        if(head == null) return null;
        ListNode slow = head;
        ListNode fast = head;
        ListNode mid = null;
        
        ListNode head2 = null;
        ListNode vHead1 = new ListNode(-1);
        vHead1.next = head;
        ListNode vHead2 = new ListNode(-2);
        ListNode pre = vHead1;

        while(fast.next != null && fast.next.next != null){
            pre = pre.next;
            slow = slow.next;
            fast = fast.next.next;
        }
        mid = slow;
        pre.next = null;
        vHead2 = mid.next;
        mid.next = null;

        TreeNode treeHead = new TreeNode(mid.val);
        if(vHead1.next != null) treeHead.left = sortedListToBST(vHead1.next);
        if(vHead2.next != null) treeHead.right = sortedListToBST(vHead2.next);
        return treeHead;
    }
}

相關文章