前端刷题路-Day46:叶子相似的树(题号872)

199 阅读2分钟

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

叶子相似的树(题号872)

题目

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

img

举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。

如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。

如果给定的两个根结点分别为 root1root2 的树是叶相似的,则返回 true;否则返回 false

示例 1:

img

输入: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:

img

输入:root1 = [1,2,3], root2 = [1,3,2]
输出:false

提示:

  • 给定的两棵树可能会有 1200 个结点。
  • 给定的两棵树上的值介于 0200 之间。

链接

leetcode-cn.com/problems/le…

解释

这题啊,这题是重拳出击。

这题其实很简单,遍历一下两颗树就好了,没什么技术难度。

重点在于实现,由于遍历的方法可以随意选择,中序、前序或者后序都是可以的,为所欲为。

自己的答案(迭代)

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:想查看往期文章和题目可以点击下面的链接:

这里是按照日期分类的👇

前端刷题路-目录(日期分类)

经过有些朋友的提醒,感觉也应该按照题型分类
这里是按照题型分类的👇

前端刷题路-目录(题型分类)

有兴趣的也可以看看我的个人主页👇

Here is RZ