相同的树

795 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

一、题目

LeetCode 相同的树

给你两棵二叉树的根节点 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] 内
-104 <= Node.val <= 104

二、题解

题目给定有两颗二叉树节点,需要比较两个二叉树结构是否相同即左右子树的结构一致,并且对应的节点值也是要相同的。

方法一

当两个二叉树的节点为零的时候两个二叉树的结构也是都一直的了,当两个二叉树的节点只有一个节点的时候只需要比较节点值是否一致。当有更多的节点的时候就需要遍历两个二叉树的节点来一一比较了,而遍历二叉树的节点可以用深度优先搜索来遍历,可以递归同时遍历两个二叉树的节点。如果两个二叉树的节点都是空那么就返回true,如果两个节点有一个为空一个不为空那么肯定是不一致的返回false,如果两个节点都不为空的话那么就判断两个节点的值是否一致,如果节点值是不相同的那么整个二叉树都不可能相同直接返回false,否则说明目前的节点值都是相同的则继续递归遍历之后的节点即左右子树的节点即可。

方法二

也可以使用BFS深度优先搜索遍历二叉树节点校验,需要使用两个队列辅助遍历,用来记录遍历节点,判断两个队列的节点值,如果节点值不相同的话说明两个树不相同,否则判断节点子树节点,如果一个节点为空,一个不为空那么也是树不相同的,否则添加对应的子树节点到队列中,继续判断。

三、代码

方法一 Java代码

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if (p == null && q == null) {
            return true;
        }
        if (p == null || q == null) {
            return false;
        }
        if (p.val != q.val) {
            return false;
        }
        return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
    }
}

时间复杂度:O(n),需要遍历一次两个二叉树的节点。

空间复杂度:O(n),递归遍历消耗的栈空间。