leetcode每天一题:【相同的树】(简单)

140 阅读2分钟

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

题目描述

leetcode题目地址

给定2个二叉树 pq ,需要你判断这两个二叉树是不是相同的。

如果是相同的,则返回true。否则返回false

如何判断是否相等, 二叉树的结构一样,然后节点的val是一样的,则认为这两个二叉树是相同的。

举个例子:

结构一样,节点的val一样,是相等的

image.png

节点的val一样,但是结构不一致,所以是不相等

image.png

思路分析

第一种方法

我们可以先对根节点判断,如果都为空,则证明当前节点为空,返回true

如果不相等则返回false

如果根节点的val相等,则继续判断左边树,递归调用来判断。

如果左边树不相等,则直接返回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 && q) return false
  if (p.val !== q.val) return false
  return isSameTree(p.left, q.left) && isSameTree(p.right, q.right)
};

image.png

第二种方法

第一种方法使用了dfs, 深度优先算法,先算根节点,再计算左边树,算完左边树再计算右边树。

这个方法主要是利用bfs,广度优先算法,由上往下计算,算完一层再计算一层。

先把根节点放到对应的队列数组中,然后把它们取出来判断val是否相等,如果不相等则返回false

然后接着取根节点下的左右节点,如果有一个有节点,另一个没有,则返回false

然后把它们push到队列数组中,这里使用的while循环,push后的队列数组长度如果不一样,则会返回false

while循环以队列数组的长度为条件,重复上面的操作,当遍历到最后的时候,队列应该是空的,然后退出循环,则证明树的节点都是相同的,返回true即可。

代码如下:

/**
 * 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

  const pQuene = [p]
  const qQuene = [q]
  while (pQuene.length || qQuene.length) {
    let pLen = pQuene.length
    let qLen = qQuene.length
    if (pLen !== qLen) return false
    const p = pQuene.shift()
    const q = qQuene.shift()
    if (p.val !== q.val) return false
    const pl = p.left
    const pr = p.right
    const ql = q.left
    const qr = q.right
    if ((pl && !ql) || (!pl && ql)) return false
    if ((pr && !qr) || (!pr && qr)) return false
    pl && pQuene.push(pl)
    pr && pQuene.push(pr)
    ql && qQuene.push(ql)
    qr && qQuene.push(qr)
  }
  return true
};

image.png