LeetCode 🟡 1382. Balance a Binary Search Tree
🔗 🟡 1382. Balance a Binary Search Tree 1541
tags: Weekly Contest 180
DFS
樹(Tree)
二元樹(Binary Tree)
BST
分治法(Divide and Conquer)
貪心(Greedy)
題意
給定一個 二元搜尋樹(Binary Search Tree, BST) 的根節點 ,請將其轉換為一個 平衡 的二元搜尋樹,新生成的樹應該與原來的樹有着相同的節點值。如果有多種構造方法,請你返回任意一種。
如果一棵二元搜尋樹中,每個節點的兩棵子樹高度差不超過 ,我們就稱這棵二元搜尋樹是 平衡的 。
思路:中序遍歷 + 分治法
雖然看似需要用 AVL 樹或紅黑樹等平衡二元搜尋樹的 旋轉(Rotation) 來解決,但其實只需要基於 貪心(Greedy) 的思路,使得 左右子樹的節點數量盡量平均 ,進而達到平衡的效果。
為了利用及維持二元搜尋樹的性質,我們可以先對其進行 中序遍歷 ,將節點值存儲在一個列表 中,使得 是一個有序列表。
然後根據 中間值建立一個新的平衡二元搜尋樹,選擇 中間的元素作為新的根節點,然後遞迴地構建左右子樹。因為每次都選擇中間元素作為根節點,所以新生成的二元搜尋樹一定是平衡的。在遞迴過程中會不斷的把問題分解成兩個子問題,直到到達邊界條件為止,這裡利用到了 分治法(Divide and Conquer) 的思想。
令 表示當前需要構建平衡二元搜尋樹的區間,則中間元素的索引為 ,新的根節點的值為 。然後遞迴地構建左右子樹,左子樹的區間為 ,右子樹的區間為 ,直到區間為空,即 時返回 。遞迴入口為 ,其中 是 的長度。
複雜度分析
- 時間複雜度:,其中 是原始二元搜尋樹的節點數。我們需要先進行一次中序遍歷將所有節點值保存在 列表中,這需要 的時間。然後我們需要遞迴地構建新的平衡二元搜尋樹,這也需要 的時間。
- 空間複雜度:,我們需要額外使用 的空間來保存 列表。
1 | class Solution: |
1 | class Solution { |
寫在最後
Cover photo is generated by @たろたろ, thanks for their work!
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 十六個天亮!
評論
WalineGiscus