题目描述
举个例子,如上图所示,给定一颗叶值序列为 (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