持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
一、题目描述:
100. 相同的树 - 力扣(LeetCode) (leetcode-cn.com)
给你两棵二叉树的根节点 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
提示:
- 两棵树上的节点数目都在范围 [0, 100] 内
- -10^4 <= Node.val <= 10^4
二、思路分析:
可以使用广度优先搜索遍历两个二叉树,判断两个二叉树是否相同。
使用两个队列分别存储两个二叉树的结点,同时遍历两个二叉树。初始时将两个二叉树的根结点分别入两个队列,遍历过程中,每次从两个队列分别将一个结点出队列,这两个出队列的结点一定是两个二叉树中的相同位置的结点,执行如下操作。
- 如果两个结点值不同,则两个二叉树的相同位置处的结点值不同,因此两个二叉树不同。
- 如果两个结点值相同,则分别获得两个结点的左子结点和右子结点,如果两个左子结点恰好有一个为空,或者两个右子结点恰好有一个为空,则两个二叉树的结构不同,因此两个二叉树不同。
- 如果两个结点的左子结点和右子结点的结构相同,则将的非空左子结点和右子结点分别入相应的队列。
当队列为空时,遍历结束,如果在任意位置,两个二叉树的结构都相同且结点值都相同,则两个二叉树相同。
三、AC 代码:
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
}
if (p == null || q == null) {
return false;
}
Queue<TreeNode> queue1 = new ArrayDeque<TreeNode>();
Queue<TreeNode> queue2 = new ArrayDeque<TreeNode>();
queue1.offer(p);
queue2.offer(q);
while (!queue1.isEmpty()) {
TreeNode node1 = queue1.poll();
TreeNode node2 = queue2.poll();
if (node1.val != node2.val) {
return false;
}
TreeNode left1 = node1.left, right1 = node1.right, left2 = node2.left, right2 = node2.right;
if (left1 == null ^ left2 == null) {
return false;
}
if (right1 == null ^ right2 == null) {
return false;
}
if (left1 != null) {
queue1.offer(left1);
queue2.offer(left2);
}
if (right1 != null) {
queue1.offer(right1);
queue2.offer(right2);
}
}
return true;
}
}