133. Clone Graph

題目
思路:

  1. 可以找到最小可重複動作嗎?
    • 題目的 method 要傳入 first node, 回傳它的 clone
    • 最小可重複動作可設定為:給定一個 node, 回傳 its clone
  2. DFS: 先寫 recursive case
  3. Base case: method 收到已 clone 過的 node
    • Use a dict to record nodes been cloned.
  4. 須注意傳入 cloneGraph 的 node 有可能是 None

733. Flood Fill

題目
紀錄一下一開始的思路,檢討錯誤,再整理最後的答案。一開始的想法:

  1. 這應該可以分解成最小可重複動作,用遞迴解看看
  2. 覺得可以用原本的 method 當遞迴函式,把 image, color 照樣傳入,sr, sc 為該點的座標
  3. 最小可重複動作:從當下這點擴散到周圍四個點

589. N-ary Tree Preorder Traversal

題目
思路

  1. 樹的問題會先從遞迴來想比較直觀,首先找出最小可重複動作來作為 recursive case
  2. 先假設我們可以用題目給的 method 直接當作遞迴的函式,也就是說我們遞迴函式的回傳,是 preorder 排序的 node values
  3. 最小可重複動作:對於我這個 node 來說,回傳 preordered values
Python 3 solution
1
2
3
4
5
6
7
def preorder(self, root: 'Node') -> List[int]:
if not root:
return []
result = [root.val]
for child in root.children or []:
result.extend(self.preorder(child))
return result

Validate Binary Search Tree

題目
思路

  1. 樹的問題用遞迴來解相對上比較直覺,所以先試試遞迴解
  2. 拆解到最小單位來找 recursive case: 隨機取樹中一個點,判斷它是否 valid
  3. 大部分情況都會有上下限。以左邊的點為例,上限就是父節點的值,下限就是它所在的右子樹的父節點的值,所以這個值必須由上到下一層層傳遞下來。反之,右邊的點的話,就變成上限必須一層層傳遞下來
  4. 因為上下限必須用傳遞的,所以寫一個 function node_valid 接受上下限的參數

Binary Tree Level Order Traversal

題目
思路

  1. 一次一層很直覺想到廣先搜尋 (BFS),所以用 iterative 的做法來解
  2. 一次迴圈處理一層,並把下一層節點放入 stack 繼續在下次迴圈處理
    • stack 也是 list of list, 裡面的每個 list 都是一層節點

Binary Tree Inorder Traversal

題目
思路

  1. Inorder Traversal: 對任意節點來說,順序為 左子樹 -> 自己 -> 右子樹
  2. 可拆解為最小單位動作,即第一點,故使用遞迴

Merge Two Binary Trees

題目

做法一:recursive - DFS

  1. 找出最小的可重複動作:merge 兩個 nodes

    • 題目給的 method 就可以用來做遞迴
  2. 假設 mergeTrees 已完成,實作此最小可重複動作

    1
    2
    3
    4
    root1.val += root2.val
    root1.left = self.mergeTrees(root1.left, root2.left)
    root1.right = self.mergeTrees(root1.right, root2.right)
    return root1

Balanced Binary Tree

題目

做法一

思路:

  1. 依照 height-balanced 的定義,需要符合每個node 的左右子樹高度差都不大於 1
  2. 假設有個 function height 可以回傳 node 的 height
    • 先不實作內容
  3. 使用這個 height 完成 isBalanced

Same Tree

題目
思路:

  1. 先用以樹來說較直觀的遞迴解
  1. 要比較所有相同位置的 node 的值是否一樣,可以把所有待比較的 node pair 丟到 stack 裡一一拿出來比較,全部比完都通過的話就是一樣的 tree
  2. 一個 pair 比較後會把下面的所有分支點繼續丟進 stack 等待比較,所以用 while stack: 只要有就繼續比,一直比到完
    • 此為廣先搜尋 (Breadth-First Search)
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×