872. 叶子相似的树

168 阅读2分钟

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

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

解题思路

我们可以使用深度优先搜索的方法得到一棵树的「叶值序列」

通过定义两个函数,一个是用来查找并且记录第一颗二叉树叶子节点的。第二个函数是用来查找第二颗二叉树叶子节点,并且验证这颗二叉树的叶子节点是否与第一颗的产生的叶子节点序列相同,一旦存在一个不相同的立即返回结果。

代码

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func leafSimilar(root1 *TreeNode, root2 *TreeNode) bool {

	root := make([]int,0)
	var leadfs func(root1 *TreeNode)
	leadfs= func(root1 *TreeNode) {
		if root1.Left==nil&&root1.Right==nil{
		root=append(root,root1.Val)
			return
		}
		if root1.Left!=nil{
			leadfs(root1.Left)
		}
		if root1.Right!=nil{
			leadfs(root1.Right)
		}
	}
	leadfs(root1)
	i:=0
	flag:=true
	var check func(root1 *TreeNode)
	check= func(root1 *TreeNode) {
		if root1.Left==nil&&root1.Right==nil{
			if i<len(root)&&root[i]!=root1.Val{
				flag=false
			}
            i++
			return
		}
		if root1.Left!=nil{
			check(root1.Left)
		}
		if root1.Right!=nil{
			check(root1.Right)
		}
	}
    check(root2)
	if i!=len(root){
		return false
	}
	return flag

}
  • 空间复杂度:O(n1 + n2)。空间复杂度主要取决于存储「叶值序列」的空间以及深度优先搜索的过程中需要使用的栈空间
  • 时间复杂度:O(n1​+n2​),其中 n1​ 和 n2​ 分别是两棵树的节点个数