leetcode100 相同的树

44 阅读2分钟

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

方法一:深度优先

/**
 * 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;
    // 如果两棵二叉树中有一棵树的根节点为空,说明它们不相同
    if (!p || !q) return false;
    // 如果两棵二叉树的根节点的值不相同,说明它们不相同
    if (p.val !== q.val) return false;
    // 递归地比较两棵二叉树的左右子树是否相同
    return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
};

方法二:广度优先

function isSameTree(p, q) {
    // 如果两棵树都为空,则它们相同
    if (p === null && q === null) {
        return true;
    // 如果其中一棵树为空,另一棵不为空,则它们不相同
    } else if (p === null || q === null) {
        return false;
    }
    
    // 创建两个队列来存储树节点
    const queue1 = []; // 存储树 p 的节点
    const queue2 = []; // 存储树 q 的节点
    
    // 将根节点加入队列
    queue1.push(p);
    queue2.push(q);
    
    // 使用广度优先搜索遍历树节点,同时比较对应节点的值
    while (queue1.length > 0 && queue2.length > 0) {
        // 从队列中取出当前节点
        const node1 = queue1.shift();
        const node2 = queue2.shift();
        
        // 比较当前节点的值是否相同,如果不同则返回 false
        if (node1.val !== node2.val) {
            return false;
        }
        
        // 获取当前节点的左右子节点
        const 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.push(left1);
        }
        // 如果右子节点存在,则将其加入队列
        if (right1 !== null) {
            queue1.push(right1);
        }
        // 同样操作,将树 q 对应的左右子节点加入队列
        if (left2 !== null) {
            queue2.push(left2);
        }
        if (right2 !== null) {
            queue2.push(right2);
        }
    }
    
    // 如果两个队列都为空,则树相同,否则不同
    return queue1.length === 0 && queue2.length === 0;
}

链接:leetcode.cn/problems/lo…

来源:力扣(LeetCode)