872. 叶子相似的树(深度优先搜索)(傻瓜教程)(python)(LC)

872. 叶子相似的树

题目描述:

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

举个例子,如上图所示,给定一棵叶值序列为 (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 之间。

解题

class Solution:
    def leafSimilar(self, root1, root2):

1、准备

(1)节点间的relationship

二叉树(node.left, node.right)

(2)列表lst存放遍历结果

写在类里
class Solution():
    def __init__(self):
        self.lst1 = []
        self.lst2 = []

(3)集合set(去重)

二叉树的结果决定不需要这一步



2、递归

		def dfs(node):

(1)首先判断根节点是否为空节点

			if node:

(2)判断条件,是否输出

因为我们不求“枝干”只求“叶“,所以条件就是二叉树末端
				if not node.left and not node.right:
                    self.lst.append(node.val)

(3)依次取出relation中的下一个节点next_root,然后dfs(next_root)

				dfs(node.left)
				dfs(node.right)

3、返回答案

先根据lst 1,2写两个函数
再执行
最后判断
		return self.lst1 == self.lst2

完整代码1

class Solution():
    def __init__(self):
        self.lst1 = []
        self.lst2 = []

    def leafSimilar(self, root1: TreeNode, root2: TreeNode) -> bool:
        def dfs1(node):
            if node:
                if not node.left and not node.right:
                    self.lst1.append(node.val)
                dfs1(node.left)
                dfs1(node.right)

        def dfs2(node):
            if node:
                if not node.left and not node.right:
                    self.lst2.append(node.val)
                dfs2(node.left)
                dfs2(node.right)

        dfs1(root1)
        dfs2(root2)
        return self.lst1 == self.lst2

用生成器优化代码(完整代码2)

class Solution:
    def leafSimilar(self, root1, root2):
        def dfs(node):
            if node:
                if not node.left and not node.right:
                    yield node.val
                yield from dfs(node.left)
                yield from dfs(node.right)

        return list(dfs(root1)) == list(dfs(root2))

深度优先搜索的框架

猜你喜欢

转载自blog.csdn.net/qq_51174011/article/details/112393024