Skip to content

Latest commit

 

History

History
110 lines (75 loc) · 3.05 KB

904-leaf-similar-trees.md

File metadata and controls

110 lines (75 loc) · 3.05 KB

请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列

举个例子,如上图所示,给定一棵叶值序列为 (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 个结点。
  • 给定的两棵树上的值介于 0200 之间。

Solutions

1. 遍历

后续遍历的变形,不需要返回自身节点。遍历函数返回一个生成器,逐个比较生成器值。

时间复杂度 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