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

LeetCode 572: Subtree of Another Tree

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

基本資料
#

難易度: easy 第一次嘗試:2022-08-27

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

解題思路
#

子樹必須從某個節點開始、一直到葉子都一樣(Tree 模板一)。所以對 root 的每一個節點都用 LC 100 的方法比一次:

  • 以目前節點為根的樹跟 subRoot 相同,就是 True。
  • 否則往左右子樹繼續找(呼叫 isSubtree,不是 isSame)。

我的嘗試
#

這題提交了 23 次:

  • 第一版的 stack 只彈出、沒有推進小孩,也沒有真的比較樹,[1] 和 [1] 都回傳 False。
  • 之後很多版的錯都一樣:檢查完根之後,往下只呼叫 isSame(root.left, subRoot)、isSame(root.right, subRoot),只比到第二層,更深的地方沒找。例如 root 是 [1, 1, 1, 2]、subRoot 是 [2]:2 在第三層,答案 True,回傳 False。

正確解法
#

class Solution:
    def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
        def same(a, b):
            if not a or not b:
                return a is b
            return a.val == b.val and same(a.left, b.left) and same(a.right, b.right)
        if not root:
            return False
        return same(root, subRoot) or self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot)

複雜度
#

時間 O(m · n),空間 O(h)。用序列化加字串比對可以做到 O(m + n)。

要特別避免的錯誤
#

  • 遞迴往下找時呼叫的是 isSubtree,不然只會檢查到第二層。
  • root 是空的時候要回傳 False(subRoot 至少有一個節點)。

面試口說整理
#

我對主樹的每個節點都檢查一次以它為根的子樹是否跟目標完全相同,相同就回傳 True,否則繼續往左右子樹找。時間 O(mn)。

相關文章

LeetCode 563: Binary Tree Tilt
·1 分鐘
LeetCode Easy Tree Depth-First-Search Binary-Tree Dp-on-Trees
LeetCode 563 解題筆記:後序回傳子樹的總和,每個節點的 tilt 是左右子樹總和的差,加進答案
LeetCode 501: Find Mode in Binary Search Tree
·1 分鐘
LeetCode Easy Tree Depth-First-Search Binary-Search-Tree Binary-Tree
LeetCode 501 解題筆記:BST 中序是排序的,相同的值會連在一起;中序時數目前這段的長度,比最大值大就重設答案,一樣大就加入
LeetCode 543: Diameter of Binary Tree
·1 分鐘
LeetCode Easy Tree Depth-First-Search Binary-Tree Dp-on-Trees
LeetCode 543 解題筆記:直徑可能不經過根;後序回傳高度,同時在每個節點用「左高 + 右高」更新答案;算的是邊數
LeetCode 404: Sum of Left Leaves
·1 分鐘
LeetCode Easy Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 404 解題筆記:DFS 時告訴小孩自己是不是左小孩,只有「是左小孩而且是葉子」才加
LeetCode 226: Invert Binary Tree
·1 分鐘
LeetCode Easy Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 226 解題筆記:每個節點交換左右小孩;用同時指定,避免先改掉的那邊被拿來用
LeetCode 145: Binary Tree Postorder Traversal
·1 分鐘
LeetCode Easy Stack Tree Depth-First-Search Binary-Tree
LeetCode 145 解題筆記:迭代的後序遍歷,節點第一次彈出時標記後放回去,再依序推右、左小孩;第二次彈出才記錄