1 问题
请考虑一棵二叉树上所有的叶子
,这些叶子的值按从左到右
的顺序排列形成一个 叶值序列
。
举个例子,如上图所示,给定一棵叶值序列为 (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,2,3], root2 = [1,3,2]
输出:false
提示:
- 给定的两棵树
结点数
在[1, 200]
范围内 - 给定的两棵树上的
值
在[0, 200]
范围内
2 解题思路
2.1 DFS
分别遍历两棵树的节点,将叶子节点入队,最终判定队列结果是否相等。
- 时间复杂度:
n
和m
分别代表两棵树的节点数量
。复杂度为O(n+m)
- 空间复杂度:
n
和m
分别代表两棵树的节点数量,当两棵树都只有一层的情况,所有的节点值都会被存储在list
中。复杂度为O(n+m)
2.2 迭代
通过手工入栈出栈,模拟递归流程。
3 代码
3.1 DFS
/**
* 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 {
//dfs
public boolean leafSimilar(TreeNode root1, TreeNode root2) {
List<Integer> seq1 = new ArrayList<Integer>();
List<Integer> seq2 = new ArrayList<Integer>();
dfs(root1, seq1);
dfs(root2, seq2);
return seq1.equals(seq2);
}
private void dfs(TreeNode root, List<Integer> seq){
if(null == root){
return;
}
if(null==root.left && null==root.right){
seq.add(root.val);
}
dfs(root.left, seq);
dfs(root.right, seq);
}
}
3.2 迭代
class Solution {
public boolean leafSimilar(TreeNode t1, TreeNode t2) {
List<Integer> l1 = new ArrayList<>(), l2 = new ArrayList<>();
process(t1, l1);
process(t2, l2);
if (l1.size() == l2.size()) {
for (int i = 0; i < l1.size(); i++) {
if (!l1.get(i).equals(l2.get(i))) return false;
}
return true;
}
return false;
}
void process(TreeNode root, List<Integer> list) {
Deque<TreeNode> d = new ArrayDeque<>();
while (root != null || !d.isEmpty()) {
while (root != null) {
d.addLast(root);
root = root.left;
}
root = d.pollLast();
if (root.left == null && root.right == null) list.add(root.val);
root = root.right;
}
}
}
//作者:宫水三叶
//链接:https://leetcode.cn/problems/leaf-similar-trees/solutions/767347/gong-shui-san-xie-yi-ti-shuang-jie-di-gu-udfc/
//来源:力扣(LeetCode)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。