Leetcode-872-叶子相似的树

Leetcode-872-叶子相似的树

题目描述

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

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

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

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

示例 1:

mark

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

mark

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

给定的两棵树可能会有 1 到 200 个结点。
给定的两棵树上的值介于 0 到 200 之间。

方法 : DFS

  • 可以使用深度优先搜索的方法得到一棵树的「叶值序列」。
  • 具体地,在深度优先搜索的过程中,我们总是先搜索当前节点的左子节点,再搜索当前节点的右子节点。
  • 如果我们搜索到一个叶节点,就将它的值放入序列中。
  • 在得到了两棵树分别的「叶值序列」后,我们比较它们是否相等即可。
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
/**
* 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 {
public boolean leafSimilar(TreeNode root1, TreeNode root2) {
// 1. 创建两个叶子节点顺序集:判断是否相同
List<Integer> seq1 = new ArrayList<>();
if(root1 != null){
dfs(root1,seq1);
}
List<Integer> seq2 = new ArrayList<>();
if(root2 != null){
dfs(root2,seq2);
}

return seq1.equals(seq2);
}

// 2. dfs逻辑
public void dfs(TreeNode root,List<Integer> seq){
// 2.1 递归结束的条件
if(root.left == null && root.right == null){
seq.add(root.val);
}
// 2.2 递归 : 满足先左后右的顺序
if(root.left != null){
dfs(root.left,seq);
}
if(root.right != null){
dfs(root.right,seq);
}
}
}

复杂度分析

  • 时间复杂度:O(n1 + n2) 。 n1, n2分别是两棵树的节点个数。

  • 空间复杂度:O(n1 + n2) 。空间复杂度主要取决于存储「叶值序列」的空间以及深度优先搜索的过程中需要使用的栈空间。

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信