前言
尽管今天有点困,有些累,但是坚持博客是不能落下的!继续日更!
昨天刚复习了树的结构,这不今天刚好每日一题就是有关树结构的。
题目描述
请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。
举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。
如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。
如果给定的两个根结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/leaf-similar-trees
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
一开始,还想些骚操作,把左边叶子和右边叶子逐一比较。但是一想,算了,还是先用简单的方法实现吧。于是,分别用2个List将每棵树的叶子全部记录下来,然后遍历对比。
public boolean leafSimilar(TreeNode root1, TreeNode root2) {
List<Integer> leaf1 = new ArrayList<>();
List<Integer> leaf2 = new ArrayList<>();
findLeaf(root1, leaf1);
findLeaf(root2, leaf2);
if (leaf1.size() != leaf2.size()) {
return false;
}
for (int i=0; i<leaf1.size(); i++) {
if (!leaf1.get(i).equals(leaf2.get(i))) {
return false;
}
}
return true;
}
private void findLeaf(TreeNode root, List<Integer> leaf) {
if (root == null) {
return ;
}
if (root.left == null && null == root.right) {
leaf.add(root.val);
return ;
}
findLeaf(root.left, leaf);
findLeaf(root.right, leaf);
}
写完后,跑去看了下官方题解,结果,也没有更好的实现。跟我一样的思路。不过,倒是发现了另外一个性能相关的点:List leaf作为入参传递进去时,作为成员变量访问的性能要快。大概是因为成员变量需要通过当前对象去访问,而方法入参是局部变量。访问速度上肯定要快一些,加上这是个递归不断访问,性能差异就会有所显现。
今天,就这么愉快的打卡啦