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

雄獅虎豹發表於2021-11-23

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

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

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

示例說明請見LeetCode官網。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解法一:遞迴

首先,將連結串列轉化成陣列,然後處理過程就和 LeetCode-108-將有序陣列轉換為二叉搜尋樹 的解法完全一樣了。

根據二叉搜尋樹的性質,因為給定的陣列是按升序排列的,所以可以確定陣列num即為該二叉搜尋樹的中序遍歷序列,為了得到一顆平衡的二叉樹,取陣列中間位置的節點作為根節點,這樣,左右子樹的節點較為平衡,具體處理過程如下:

  • 呼叫遞迴方法,初始的起始位置為陣列的長度;
  • 當起點位置大於終點位置時,說明節點已經遍歷完了,直接返回空樹;
  • 獲取中間位置的值作為根節點,這樣左右子樹的節點樹是比較均衡的;
  • 然後遞迴獲得當前根節點的左右子樹;
  • 最後返回根節點即為平衡的二叉搜尋樹。
import com.kaesar.leetcode.ListNode;
import com.kaesar.leetcode.TreeNode;

import java.util.LinkedList;
import java.util.Queue;

public class LeetCode_109 {
    public static TreeNode sortedListToBST(ListNode head) {
        Queue<Integer> queue = new LinkedList<>();
        while (head != null) {
            queue.add(head.val);
            head = head.next;
        }
        int[] nums = new int[queue.size()];
        int index = 0;
        // 先將連結串列轉換成陣列,即為二叉樹的中序遍歷序列
        while (!queue.isEmpty()) {
            nums[index++] = queue.poll();
        }
        // 呼叫遞迴方法,初始的起始位置為陣列的長度
        return sortedListToBST(nums, 0, nums.length - 1);
    }

    /**
     * 遞迴
     *
     * @param nums
     * @param left
     * @param right
     * @return
     */
    private static TreeNode sortedListToBST(int[] nums, int left, int right) {
        // 當起點位置大於終點位置時,說明節點已經遍歷完了,直接返回空樹
        if (left > right) {
            return null;
        }
        // 獲取中間位置的值作為根節點,這樣左右子樹的節點樹是較為平衡點
        int mid = (left + right) / 2;
        TreeNode root = new TreeNode(nums[mid]);
        // 然後遞迴獲得當前根節點的左右子樹
        root.left = sortedListToBST(nums, left, mid - 1);
        root.right = sortedListToBST(nums, mid + 1, right);
        return root;
    }

    public static void main(String[] args) {
        ListNode head = new ListNode(-10);
        head.next = new ListNode(-3);
        head.next.next = new ListNode(-0);
        head.next.next.next = new ListNode(5);
        head.next.next.next.next = new ListNode(9);

        sortedListToBST(head).print();
    }
}
【每日寄語】 任鐵任金,定有可穿之硯;日磨日削,從無不銳之針。

相關文章