题目描述
题干:
请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。
![example](https://note.youdao.com/yws/api/personal/file/WEB6c32f70df2b5ea9908f7804b18ac8f4d?method=download&shareKey=a731474530d8ac7db686f252aab9bf2e)
举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。
如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。
如果给定的两个根结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。
示例1:
![examlpe1](https://note.youdao.com/yws/api/personal/file/WEB83241115e16a554c872a3173c4a9bcb2?method=download&shareKey=104c3ded41c516c96a0c4ae609f861d8)
输入: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
题解思路
比较两个二叉树的叶子节点是否相同,显而易见,只要我们得到两棵二叉树的叶值序列比较即可
这里就采用基础的深度优先遍历,将访问到的叶子节点存放在集合中比较,代码如下
正确代码
public boolean leafSimilar(TreeNode root1, TreeNode root2) {
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);
}
//深度优先遍历
public void dfs(TreeNode node, List<Integer> seq) {
if (node.left == null && node.right == null) {
seq.add(node.val);
} else {
if (node.left != null) {
dfs(node.left, seq);
}if (node.right != null) {
dfs(node.right, seq);
}
}
}
总结
基础的二叉树问题,当然如果采用层序遍历也是可以的,因为复杂度相差不大,就见仁见智了
如果文章存在问题或者有更好的题解,欢迎评论区斧正和评论,各自努力,你我最高处见