题解 | #相逆叶子# java
相逆叶子
https://www.nowcoder.com/practice/41c7b0e8710e43ca9f328bf06ea2aff3
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root1 TreeNode类
* @param root2 TreeNode类
* @return bool布尔型
*/
public boolean leafSimilar (TreeNode root1, TreeNode root2) {
// write code here
List<Integer> leftList = new ArrayList<>();
List<Integer> rightList = new ArrayList<>();
getAllLeaf(root1, leftList);
getAllLeaf(root2, rightList);
int lsl = leftList.size();
int rsl = rightList.size();
if (lsl != rsl) {
return false;
}
int i = 0;
int j = lsl - 1;
while (i < j) {
if (leftList.get(i) != rightList.get(j)) {
return false;
}
i++;
j--;
}
return true;
}
private void getAllLeaf(TreeNode root, List<Integer> leafList) {
if (root == null) {
return;
}
if (root.left == null && root.right == null) {
leafList.add(root.val);
}
getAllLeaf(root.left, leafList);
getAllLeaf(root.right, leafList);
}
}
这道题目主要考察的是二叉树的遍历和比较。给定两棵二叉树 root1 和 root2,我们需要判断它们的叶子节点是否相似。
代码解释:
- 首先定义了一个树节点类 TreeNode,包含节点的值 val 和指向左右子树的引用 left 和 right。
- 在 Solution 类中,有一个 leafSimilar 方法,用于判断两棵二叉树的叶子节点是否相似。参数是两个树节点 root1 和 root2,返回值为布尔型。
- 在方法体中,定义了两个空的列表 leftList 和 rightList,用于存储两棵树的叶子节点。
- 调用 getAllLeaf 方法分别获取 root1 和 root2 的叶子节点,将叶子节点存入对应的列表中。
- 获取两个列表的长度 lsl 和 rsl,如果长度不相等,说明叶子节点个数不同,直接返回 false。
- 使用双指针技巧,初始化指针 i 为 0,指针 j 为 lsl - 1。通过循环比较 leftList[i] 和 rightList[j] 是否相等,如果不相等则返回 false。
- 循环结束后,说明所有叶子节点都已比较完毕且相等,返回 true。
- 定义了一个辅助方法 getAllLeaf,用于递归获取树的叶子节点。传入当前节点 root 和一个列表 leafList,如果当前节点是叶子节点(即左右子树为空),则将节点的值存入列表中。否则,递归调用 getAllLeaf 方法获取左子树和右子树的叶子节点。


