力扣 872. 叶子相似的树

题目说明

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

    image-20210510171840857

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

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

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

  • 提示:

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

示例

示例 1:

image-20210510171918014

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

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

示例 3:

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

示例 4:

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

示例 5:

image-20210510171928356

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

笔者理解

此题是一道树算法问题,在力扣题库中被定义为简单题。

解法

当笔者阅读完此题后,发现此题用两个列表分别来存储两棵树的叶子节点即可,让我们来看看具体如何实现的吧。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
// 分别存储两棵树的叶子节点
ArrayList<Integer> list1 = new ArrayList();
ArrayList<Integer> list2 = new ArrayList();

public boolean leafSimilar(TreeNode root1, TreeNode root2) {
// 根据树的标记将其分别填入 对应树的 叶子列表
DFS(root1, 1);
DFS(root2, 2);

// 比较两个叶子节点列表是否相等即可
return list1.equals(list2);
}

public void DFS(TreeNode root, int tick) {
if (root == null) {
return;
}
// 叶子节点
if (root.left == null && root.right == null) {
if (tick == 1) {
list1.add(root.val);
}
else {
list2.add(root.val);
}
}

DFS(root.left, tick);
DFS(root.right, tick);
}
}

时间和空间效率都还行,可见此解法还比较适合此题;

image.png

总结

本题是今天的每日一题,难度是为简单,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。