[路飞]_leetcode刷题_100. 相同的树

1,261 阅读2分钟

题目

100. 相同的树

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

思路1:

深度优先遍历。 同时遍历两个二叉树,比较每一个节点的值即可。前中后序都ok。

代码如下:

/**
 * @param {TreeNode} p
 * @param {TreeNode} q
 * @return {boolean}
 */
var isSameTree = function(p, q) {
    return isSameNode(p,q)
};

function isSameNode(p,q){
    if(p == null || q == null) return p == q;
    if(p.val != q.val) return false;
    return isSameNode(p.left,q.left) && isSameNode(p.right,q.right);
}

复杂度分析

时间复杂度:O(min(m,n)),m和n分别为两个二叉树的节点数,总遍历次数不会超过较小二叉树的节点数。

空间复杂度:O(min(m,n)),m和n分别为两个二叉树的高度,总遍历层数不会超过小的二叉树的高度,因为递归调用需要额外用栈存储,最坏的情况是,高度等于节点数,即二叉树为链表。

思路2:

广度优先遍历。

/**
 * @param {TreeNode} p
 * @param {TreeNode} q
 * @return {boolean}
 */
var isSameTree = function(p, q) {
        let queue = [];
        queue.push(p);
        queue.push(q);
        while(queue.length>0){
            p = queue.shift();
            q = queue.shift();
            if(p == null && q == null){
                continue;
            }
            if((p == null || q == null) || p.val != q.val){
                return false;
            }
            queue.push(p.left);
            queue.push(q.left);

            queue.push(p.right);
            queue.push(q.right);
        }
        return true;
};

复杂度分析

时间复杂度:O(min(m,n)),m和n分别为两个二叉树的节点数,总遍历次数不会超过较小二叉树的节点数。

空间复杂度:O(min(m,n)),m和n分别为两个二叉树的节点数,空间复杂度取决于较短队列的长度,队列的长度不会超过较小队列节点数的两倍。