给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:

输入:p = [1,2,3], q = [1,2,3] 输出:true
示例 2:

输入:p = [1,2], q = [1,null,2] 输出:false
示例 3:

输入:p = [1,2,1], q = [1,1,2] 输出:false
解题思路:
先判断两棵树当前节点是否都为空,是则返回true;若只有一棵为空则返回false。接着对比当前节点值,不等则返回false。若当前节点都存在且值相等,就递归比较它们的左子树和右子树,左右子树都相同才返回true,有一边不同就返回false。先处理输入为空的边界情况,返回空树。然后从输入首元素创建根节点并入队列,按层序遍历顺序,依输入内容为节点构建左、右子树(非 “#” 表示有节点,创建并关联后入队列),最终返回根节点。
具体代码:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
// 定义二叉树节点类
class TreeNode1 {
int val;
TreeNode left;
TreeNode right;
TreeNode1(int val) {
this.val = val;
this.left = null;
this.right = null;
}
}
class Solution3 {
public boolean isSameTree(TreeNode p, TreeNode q) {
// 如果两棵树当前节点都为空,说明同步遍历到了叶子节点的下一层,认为相同
if (p == null && q == null) {
return true;
}
// 如果其中一棵为空,另一棵不为空,结构不同,返回False
if (p == null || q == null) {
return false;
}
// 如果当前节点的值不相等,返回False
if (p.val!= q.val) {
return false;
}
// 递归比较左子树和右子树是否相同
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}
public class xiangTongDeShu{
public static TreeNode buildTree(String[] input) {
if (input == null || input.length == 0) {
return null;
}
// 使用队列辅助构建二叉树
LinkedList<TreeNode> queue = new LinkedList<>();
TreeNode root = new TreeNode(Integer.parseInt(input[0]));
queue.add(root);
int index = 1;
while (!queue.isEmpty() && index < input.length) {
TreeNode current = queue.poll();
// 构建左子树
if (!input[index].equals("#")) {
TreeNode left = new TreeNode(Integer.parseInt(input[index]));
current.left = left;
queue.add(left);
}
index++;
// 构建右子树
if (index < input.length &&!input[index].equals("#")) {
TreeNode right = new TreeNode(Integer.parseInt(input[index]));
current.right = right;
queue.add(right);
}
index++;
}
return root;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请按照层序遍历顺序输入第一棵二叉树节点值(用空格隔开,空节点用#表示):");
String inputStr1 = scanner.nextLine();
String[] inputArray1 = inputStr1.split(" ");
TreeNode tree1 = buildTree(inputArray1);
System.out.println("请按照层序遍历顺序输入第二棵二叉树节点值(用空格隔开,空节点用#表示):");
String inputStr2 = scanner.nextLine();
String[] inputArray2 = inputStr2.split(" ");
TreeNode tree2 = buildTree(inputArray2);
Solution3 solution3 = new Solution3();
boolean result = solution3.isSameTree(tree1, tree2);
System.out.println("两棵树是否相同:" + result);
scanner.close();
}
}
运行截图:


被折叠的 条评论
为什么被折叠?



