前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一天一大 lee(相同的树)难度:简单-Day20200807

一天一大 lee(相同的树)难度:简单-Day20200807

作者头像
前端小书童
发布2020-09-24 14:32:14
2780
发布2020-09-24 14:32:14
举报

题目:

给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例

  1. 示例 1
输入:       1         1
          / \       / \
         2   3     2   3

        [1,2,3],   [1,2,3]

输出: true
  1. 示例 2
输入:      1          1
          /           \
         2             2

        [1,2],     [1,null,2]

输出: false
  1. 示例 3
输入:       1         1
          / \       / \
         2   1     1   2

        [1,2,1],   [1,1,2]

输出: false

抛砖引玉

抛砖引玉

递归逐个校验

  • 递归传入节点判断是否相同,相同则继续校验左右节点
  • 同时递归到最终节点及 null 则说明所有校验均通过返回 true
  • 两个树不是同时遇到最终节点 返回 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) {
  // 判断到最终节点相同 返回true
  if (p === null && q === null) return true
  // 两个树不是同时遇到最终节点 返回false
  if (p === null || q === null) return false
  // 传入节点是否相同
  if (p.val !== q.val) return false
  // 递归判断每个节点的左右节点
  return isSameTree(p.left, q.left) && isSameTree(p.right, q.right)
}

广度优先搜索

  • 为每个树声明一个数组存放元素
  • 相同则从数组中取出
  • 不同则返回 false
var isSameTree = function (p, q) {
  // 判断到最终节点相同 返回true
  if (p === null && q === null) return true
  // 两个树不是同时遇到最终节点 返回false
  if (p === null || q === null) return false

  let dp1 = [p],
    dp2 = [q]

  while (dp1.length && dp2.length) {
    let node1 = dp1.shift(),
      node2 = dp2.shift()
    if (node1.val != node2.val) {
      return false
    }
    let left1 = node1.left,
      right1 = node1.right,
      left2 = node2.left,
      right2 = node2.right
    // 异或,均为false或者均为true 结果为false,不然为true
    if ((left1 === null) ^ (left2 === null)) return false
    if ((right1 === null) ^ (right2 === null)) return false
    // 该节点相同,继续推送下一个节点进行比较
    if (left1 !== null) dp1.push(left1)
    if (right1 !== null) dp1.push(right1)
    if (left2 !== null) dp2.push(left2)
    if (right2 !== null) dp2.push(right2)
  }
  // 所有节点比较完成返回true
  return dp1.length === 0 && dp2.length === 0
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端小书童 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 示例
  • 抛砖引玉
    • 递归逐个校验
      • 广度优先搜索
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档