題目描述
舉個例子,如上圖所示,給定一顆葉值序列爲 (6, 7, 4, 9, 8) 的樹。
如果有兩顆二叉樹的葉值序列是相同,那麼我們就認爲它們是 葉相似 的。
如果給定的兩個頭結點分別爲 root1 和 root2 的樹是葉相似的,則返回 true;否則返回 false 。
提示:
給定的兩顆樹可能會有 1 到 200 個結點。
給定的兩顆樹上的值介於 0 到 200 之間。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/leaf-similar-trees
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
題目解析
一種可行的解法通過深度優先遍歷生成2棵樹的葉子序列然後進行比較。
但是這樣,在葉子序列不一致時比較低效,可能很早的葉子就不同了。因此使用python中的生成器來實現。
代碼實現
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
import itertools
class Solution:
def leafSimilar(self, root1: TreeNode, root2: TreeNode) -> bool:
def get_next_leaf(root):
if root is None:
return
if root.left is None and root.right is None:
yield root
yield from get_next_leaf(root.left)
yield from get_next_leaf(root.right)
if root1 is None:
return root2 is None
if root2 is None:
return root1 is None
leafs1 = get_next_leaf(root1)
leafs2 = get_next_leaf(root2)
leafs = itertools.zip_longest(leafs1, leafs2)
for leaf1, leaf2 in leafs:
if leaf1 is None:
return leaf2 is None
if leaf2 is None:
return leaf1 is None
if leaf1.val != leaf2.val:
return False
return True