LeetCode 相同的树

72 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

一、题目描述:

100. 相同的树 - 力扣(LeetCode) (leetcode-cn.com)

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

image.png

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

示例 2:

image.png

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

示例 3:

image.png

输入:p = [1,2,1], q = [1,1,2]
输出:false

提示:

  • 两棵树上的节点数目都在范围 [0, 100] 内
  • -10^4 <= Node.val <= 10^4

二、思路分析:

可以使用广度优先搜索遍历两个二叉树,判断两个二叉树是否相同。

使用两个队列分别存储两个二叉树的结点,同时遍历两个二叉树。初始时将两个二叉树的根结点分别入两个队列,遍历过程中,每次从两个队列分别将一个结点出队列,这两个出队列的结点一定是两个二叉树中的相同位置的结点,执行如下操作。

  1. 如果两个结点值不同,则两个二叉树的相同位置处的结点值不同,因此两个二叉树不同。
  2. 如果两个结点值相同,则分别获得两个结点的左子结点和右子结点,如果两个左子结点恰好有一个为空,或者两个右子结点恰好有一个为空,则两个二叉树的结构不同,因此两个二叉树不同。
  3. 如果两个结点的左子结点和右子结点的结构相同,则将的非空左子结点和右子结点分别入相应的队列。

当队列为空时,遍历结束,如果在任意位置,两个二叉树的结构都相同且结点值都相同,则两个二叉树相同。

三、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;
    }
}