iT邦幫忙

1

Leetcode Challenge: Invert Binary Tree (6/1)

今天是 6/1,也是正式挑戰的第一天,果不其然是一道 Easy 的題目:Invert Binary Tree,如下圖的解釋不能再多了。題目出處是 No. 226 (https://leetcode.com/problems/invert-binary-tree/)

https://ithelp.ithome.com.tw/upload/images/20200604/20127688lIVcEJYeIa.png

雖然這道題並不難,但是可以有兩種方式來做: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


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言