Description

給定一個升序排列的整數陣列,將其轉換為一棵高度平衡的二元搜尋樹 (BST)。高度平衡意指每個節點的左右子樹高度差不超過 1。

Example:

Input: nums = [-10,-3,0,5,9] Output: [0,-3,9,-10,null,5] (其中一個合法答案)

Intuition#

取陣列中間元素作為根,左半部建左子樹,右半部建右子樹,遞迴進行即可保證平衡。

  • 排序陣列的中間元素作為根,可以確保左右子樹的節點數量盡量相等
  • 這是一個經典的分治法應用

Approaches#

⭐ 1: 遞迴分治#

  • 概念: 每次取中間元素作為根節點,左半段遞迴建左子樹,右半段遞迴建右子樹
  • 時間複雜度: O(n),每個元素處理一次
  • 空間複雜度: O(log n),遞迴深度為平衡樹高度
class Solution {
    fun sortedArrayToBST(nums: IntArray): TreeNode? {
        return build(nums, 0, nums.size - 1)
    }

    private fun build(nums: IntArray, left: Int, right: Int): TreeNode? {
        if (left > right) return null
        val mid = left + (right - left) / 2
        val node = TreeNode(nums[mid])
        node.left = build(nums, left, mid - 1)
        node.right = build(nums, mid + 1, right)
        return node
    }
}

🔑 Takeaways#

  • Pattern: 分治法建樹 — 排序陣列取中間點作根,遞迴建左右子樹
  • 關鍵技巧: 選擇中間元素作為根節點是保證平衡的關鍵,這個技巧也適用於建構平衡 BST 的其他場景