↓快轉到主要內容
  1. LeetCode/

LeetCode 94: Binary Tree Inorder Traversal

·1 分鐘· ·
LeetCode Easy Stack Tree Depth-First-Search Binary-Tree
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-07-20

  • 提交紀錄:Wrong Answer ×2 → Runtime Error ×2 → Accepted → Runtime Error ×2 → Accepted → Runtime Error → Accepted ×3

解題思路
#

中序是「左、根、右」。遞迴寫法很直接;迭代寫法要自己模擬呼叫堆疊(Tree):

  1. 從目前節點一路往左走,經過的節點都推進 stack。
  2. 走到底後彈出一個節點,記錄它的值(左邊已經處理完了)。
  3. 轉到它的右子樹,重複。

我的嘗試
#

大部分的 RE 都是同一個原因:空樹時直接取 root.left / root.val(root 是 None)。另外有一版用了沒定義的變數(NameError)。

正確解法
#

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        res, stack, cur = [], [], root
        while cur or stack:
            while cur:
                stack.append(cur)
                cur = cur.left
            cur = stack.pop()
            res.append(cur.val)
            cur = cur.right
        return res

複雜度
#

時間 O(n),空間 O(h),h 是樹高。

要特別避免的錯誤
#

  • 外層條件是 cur or stack,兩個都空了才結束。

面試口說整理
#

我用 stack 模擬遞迴:一路往左推進 stack,走到底就彈出一個節點記錄,再轉向它的右子樹。每個節點進出 stack 各一次,時間 O(n)、空間 O(h)。

相關文章

LeetCode 144: Binary Tree Preorder Traversal
·1 分鐘
LeetCode Easy Stack Tree Depth-First-Search Binary-Tree
LeetCode 144 解題筆記:迭代的前序遍歷,彈出就記錄,先推右小孩再推左小孩,左邊才會先處理
LeetCode 83: Remove Duplicates from Sorted List
·1 分鐘
LeetCode Easy Linked-List
LeetCode 83 解題筆記:已排序,重複的一定相鄰;cur 跟 cur.next 一樣就跳過 cur.next,不一樣才前進
LeetCode 69: Sqrt(x)
·1 分鐘
LeetCode Easy Math Binary-Search Newtons-Method
LeetCode 69 解題筆記:找最大的 mid 讓 mid² <= x;閉區間二分結束時 r 就是答案
LeetCode 27: Remove Element
·1 分鐘
LeetCode Easy Array Two-Pointers
LeetCode 27 解題筆記:寫入指標只寫不等於 val 的數,最後回傳寫入的個數
LeetCode 28: Find the Index of the First Occurrence in a String
·1 分鐘
LeetCode Easy Two-Pointers String String-Matching Z-Algorithm
LeetCode 28 解題筆記:在每個起點比對 needle,或直接用 str.find;index 找不到會丟例外
LeetCode 35: Search Insert Position
·1 分鐘
LeetCode Easy Array Binary-Search
LeetCode 35 解題筆記:找第一個 >= target 的位置(lower bound);半開區間 [l, r) 要配 r = mid,不能寫 r = mid - 1