每日一题--相同的树

137 阅读2分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」。

题目

给你两棵二叉树的根节点 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

思路


如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。

如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。

代码


 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} p
 * @param {TreeNode} q
 * @return {boolean}
 */

var isSameTree = function(p, q) {
    if (!p && !q) {
        // 都是空结点
        return true;
    } else if (!p || !q) {
        // 一个空,一个非空
        return false;
    } else if (p.val !== q.val) {
        // 两个结点的值不相同
        return false;
    } else {
        // 如果左子树相同,且右子树相同,则本树相同
        return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
    }
};

时间复杂度:O(\min(m,n))O(min(m,n)),其中 mm 和 nn 分别是两个二叉树的节点数。对两个二叉树同时进行广度优先搜索,只有当两个二叉树中的对应节点都不为空时才会访问到该节点,因此被访问到的节点数不会超过较小的二叉树的节点数。