904. 叶子相似的树 - easy
请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。
举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8)
的树。
如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。
如果给定的两个根结点分别为 root1
和 root2
的树是叶相似的,则返回 true
;否则返回 false
。
示例 1:
输入:root1 = [3,5,1,6,2,9,8,null,null,7,4], root2 = [3,5,1,6,7,4,2,null,null,null,null,null,null,9,8] 输出:true
示例 2:
输入:root1 = [1], root2 = [1] 输出:true
示例 3:
输入:root1 = [1], root2 = [2] 输出:false
示例 4:
输入:root1 = [1,2], root2 = [2,2] 输出:true
示例 5:
输入:root1 = [1,2,3], root2 = [1,3,2] 输出:false
提示:
- 给定的两棵树可能会有
1
到200
个结点。 - 给定的两棵树上的值介于
0
到200
之间。
后续遍历的变形,不需要返回自身节点。遍历函数返回一个生成器,逐个比较生成器值。
时间复杂度 O(n + m); 空间复杂度 O(lg(n) + lg(m)); 使用递归栈,最大取决于树的高度。
import itertools
# 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 leafSimilar(self, root1: TreeNode, root2: TreeNode) -> bool:
g1, g2 = itertree(root1), itertree(root2)
v1, v2 = 0, 0
while v1 == v2:
if v1 == -1:
return True
v1, v2 = ng(g1), ng(g2)
return False
def ng(g):
try:
return next(g)
except StopIteration:
return -1
def itertree(tn: TreeNode):
if tn is None:
return
if tn.left is None and tn.right is None:
yield tn.val
for v in itertools.chain(itertree(tn.left), itertree(tn.right)):
yield v