[路飞]_相同的树

315 阅读2分钟

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

leetcode-100 相同的树

题目介绍

给你两棵二叉树的根节点 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. 如果两个相同位置的节点都为空,返回 true
  2. 如果两个节点一空一非空,或者两个节点的值不相等,返回 false
  3. 继续比较当前节点的左节点和右节点

相同的树.gif

解题代码

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

思路二:广度优先遍历

解题步骤

  1. 将根节点 pq 插入到队列 queue
  2. 如果队列 queue 不为空,则出队前两个节点,分别是两棵树相同位置的节点
  3. 如果出队的两个节点都为空节点,则继续出队接下来的两个节点
  4. 如果出队的两个节点为一空一非空,或者是两个节点的值不相等,直接返回 false,结束遍历
  5. 将两个节点的左节点分别入队
  6. 将两个节点的右节点分别入队
  7. 重复步骤 2-6,直到队列 queue 为空,说明两棵树的所有节点都相同,返回 true

相同的树(1).gif

解题代码

var isSameTree = function(p, q) {
    const queue = [p, q]
    while (queue.length) {
        const node1 = queue.shift()
        const node2 = queue.shift()
        if (!node1 && !node2) continue
        if (node1 && !node2 || !node1 && node2 || node1.val !== node2.val) return false
        queue.push(node1.left)
        queue.push(node2.left)
        queue.push(node1.right)
        queue.push(node2.right)
    }
    return true
};