这是我参与更文挑战的第10天,活动详情查看: 更文挑战
叶子相似的树(题号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
之间。
链接
解释
这题啊,这题是重拳出击。
这题其实很简单,遍历一下两颗树就好了,没什么技术难度。
重点在于实现,由于遍历的方法可以随意选择,中序、前序或者后序都是可以的,为所欲为。
自己的答案(迭代)
var leafSimilar = function(root1, root2) {
function checkLeaf(node, leaves) {
if (!node.left && !node.right) leaves.push(node.val)
}
function getLeaves(root) {
var stack = [root]
leaves = []
while (stack.length) {
root = stack.pop()
checkLeaf(root, leaves)
root.right && stack.push(root.right)
root.left && stack.push(root.left)
}
return leaves.toString()
}
return getLeaves(root1) === getLeaves(root2)
};
没啥可说的,搞个getLeaves
函数来拿到树的叶子节点。getLeaves
函数的内部实现就是一个朴实无华的迭代前序遍历,最后返回数组的toString()
就完事了,简单实用。
自己的答案(递归)
var leafSimilar = function(root1, root2) {
function getLeaves(root) {
if (!root) return []
if (!root.left && !root.right) return [root.val]
return getLeaves(root.left).concat(getLeaves(root.right))
}
return getLeaves(root1).toString() === getLeaves(root2).toString()
};
递归从代码层面上来看更简单一些,但有一点需要注意。
在迭代的答案中,最后的返回值是leaves.toString()
,但是在递归中却只返回了数组,需要在外层进行操作。
Why?是因为在迭代内部进行了数组的concat
操作,如果在返回值中toString()
会导致在递归到一半的时候就已经toString()
了,最后的答案中会有数字粘在一起,黏合的规律就是树中叶子节点的规律。
注意这一点之后就没啥难的了。
更好的方法
无
PS:想查看往期文章和题目可以点击下面的链接:
这里是按照日期分类的👇
经过有些朋友的提醒,感觉也应该按照题型分类
这里是按照题型分类的👇
有兴趣的也可以看看我的个人主页👇