做法一
思路:
- 依照 height-balanced 的定義,需要符合每個node 的左右子樹高度差都不大於 1
- 假設有個 function
height可以回傳 node 的 height- 先不實作內容
- 使用這個
height完成isBalanced - 實作
height的內容
Python3 solution:
1 | # Definition for a binary tree node. |
假設有 n 個 node, 樹的高度為 h
- 時間複雜度:O(n^2)
isBalanced除了呼叫自己之外的複雜度為 O(n)- 呼叫了
n - 1次height
- 呼叫了
- 每個節點都呼叫了一次
isBalanced
- 空間複雜度:O(h)
- 因為遞迴的呼叫有 DFS 的特性,會從子節點一直呼叫到最下面的葉子節點,所以需要把那些 function calls 放進 stack 裡,等到葉子節點的呼叫到了再一一拿出來執行。因此 stack 的大小需等於呼叫的次數,也就是由根節點走到葉子節點需經過幾個點,即這棵樹的高度
- 只需考慮一次遞迴呼叫所需空間,不需考慮全部遞迴呼叫 (譬如在 function 裡呼叫了自己兩次),因為程式同時只會處理一個遞迴呼叫
- 因為遞迴的呼叫有 DFS 的特性,會從子節點一直呼叫到最下面的葉子節點,所以需要把那些 function calls 放進 stack 裡,等到葉子節點的呼叫到了再一一拿出來執行。因此 stack 的大小需等於呼叫的次數,也就是由根節點走到葉子節點需經過幾個點,即這棵樹的高度
做法二
思路:
- 有沒有辦法優化上面做法的時間複雜度呢?因為上面在算高度的時候就已經會算出每個節點的左右子樹的高度了,此時就可以順便看看是否平衡,不用等到最後再遞迴呼叫
isBalanced增加複雜度
Python3 solution:
1 | def isBalanced(self, root: Optional[TreeNode]) -> bool: |
假設有 n 個 node, 樹的高度為 h
- 時間複雜度:O(n)
- 每個節點都做過一次
height
- 每個節點都做過一次
- 空間複雜度:O(h)
- 同
做法一的分析
- 同
類似題:Symmetric Tree 用 recursive 方法來解