今天是 6/1,也是正式挑戰的第一天,果不其然是一道 Easy 的題目:Invert Binary Tree,如下圖的解釋不能再多了。題目出處是 No. 226 (https://leetcode.com/problems/invert-binary-tree/)
雖然這道題並不難,但是可以有兩種方式來做:DFS & BFS,對於這兩個還不是很知道是什麼的,可以先去參考網路上的解釋。以這題來說, DFS 比較直覺,因為是用遞迴的方式 (一個一個 Branch 處理),而 BFS 則是需要一個 Queue,在過程中會把之後需要交換左右子樹的節點放入 Queue 中,並且一次處理 Queue 中的一個節點 (先放入的先拿出來處理),直到 Queue 中所有的節點都處理完為止 (一層一層往下處理)。
Code 的部分:
DFS:就是用遞迴
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def invertTree(self, root: TreeNode) -> TreeNode:
if root is None:
return
root.left, root.right = root.right, root.left
self.invertTree(root.left)
self.invertTree(root.right)
return root
BFS:這裡可以用 collections 中的 deque,也可以單純用個 List 來作為 Queue。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def invertTree(self, root: TreeNode) -> TreeNode:
if root is None:
return
queue = []
queue.append(root)
while len(queue) > 0:
node = queue.pop(0)
node.left, node.right = node.right, node.left
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return root
時間上 BFS 會比 DFS 稍快,因為可以看到 BFS 只針對真的節點去處理,但是 DFS 會在進到 function 中才知道這個節點是真的節點還是 None ,所以會多花一些時間。空間上 BFS 最糟就是 Tree 的最大寬度,而 DFS 則是 Tree 的深度,因為要記錄 Call Stack。
最後講講有趣的事,這個問題似乎源自於 Homebrew 的作者去 Google 面試的時候不會做這題被嗆:
Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so f*** off.
所以大家把這題學會了,你就有機會比大神更神了 (誤
歡迎追蹤我的 Medium 囉!
https://medium.com/@ryanyang1221