iT邦幫忙

2025 iThome 鐵人賽

0

Subtree of Another Tree

LC 572

  • 類別:DFS / Tree Comparison
  • 判斷樹 t 是否是樹 s 的子樹。
  • (即存在一個節點 x,使得以 x 為根的子樹與 t 完全相同)

thoughts

  • 遍歷 s 的每個節點。
  • 當找到與 t 根節點值相同的節點時,用 isSameTree() 判斷是否相同。
  • 時間:O(m * n)(最壞情況,m 與 n 為樹的節點數)
  • 空間:O(h)
  • 可優化版本(進階 Follow-up):
    • 先將樹序列化為字串(例如 preorder),再用 KMP 或 Rabin-Karp 檢查子字串。
      → 時間可降為 O(m + n)

Kotlin

fun isSubtree(root: TreeNode?, subRoot: TreeNode?): Boolean {
    if (root == null) return false
    if (isSameTree(root, subRoot)) return true
    return isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot)
}

fun isSameTree(p: TreeNode?, q: TreeNode?): Boolean {
    if (p == null && q == null) return true
    if (p == null || q == null) return false
    if (p.`val` != q.`val`) return false
    return isSameTree(p.left, q.left) && isSameTree(p.right, q.right)
}

Follow-up

  • 如何用序列化 + 字串比對優化時間?
  • 若樹節點數非常大,如何減少遞迴堆疊?
  • 如何處理多棵子樹同時比對(批次匹配)?

上一篇
#28
系列文
來都來了-涮就涮吧30
  1. 26
    #25
  2. 27
    #26
  3. 28
    #27
  4. 29
    #28
  5. 30
    #29
完整目錄
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言