当前位置: 首页 > article >正文

数据结构与算法之二叉树: LeetCode 100. 相同的树 (Typescript版)

相同的树

  • https://leetcode.cn/problems/same-tree/

描述

  • 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

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

示例 1

  1         1
 /  \      /  \  
2    3    2    3   
输入:p = [1,2,3], q = [1,2,3]
输出:true

示例 2

  1      1
 /        \  
2          2
输入:p = [1,2], q = [1,null,2]
输出:false

示例 3

  1         1
 /  \      /  \  
2    1    1    2
输入:p = [1,2,1], q = [1,1,2]
输出:false

提示

  • 两棵树上的节点数目都在范围 [0, 100] 内
  • - 1 0 4 10^4 104 <= Node.val <= 1 0 4 10^4 104

算法实现

1 )深度优先递归版本

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function isSameTree(p: TreeNode | null, q: TreeNode | null): boolean {
    // 都为空时
    if(!p && !q) return true;
    // 不相同时
    if (p?.val !== q?.val) return false;
    // 递归判断
    return isSameTree(p?.left, q?.left) && isSameTree(p?.right, q?.right);
};
  • 解题思路
    • 两棵树相同:根节点值相同,左子树相同,右子树相同
    • 如此一来,我们把若干大问题,分解成若干个相似小问题
    • 符合:分、解、合特性
    • 选择分而治之
  • 解题步骤
    • 分:获取两个树的左子树和右子树
    • 解:递归地判断两个树的左子树是否相同,右子树是否相同
    • 合:将上述结果合并,若根节点值也相同,树就相同
  • 时间复杂度:O(n)
    • n是所有节点数
  • 空间复杂度:O(n)
    • 递归,底部形成堆栈
    • n是树的节点数,最坏情况下,树的节点数是树的高度

2 )广度优先迭代版本

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function isSameTree(p: TreeNode | null, q: TreeNode | null): boolean {
    // 都为空时
    if(!p && !q) return true;
    // 不相同时
    if (p?.val !== q?.val) return false;
    // 声明两个队列
    const queue1 = [p];
    const queue2 = [q];
    // 迭代对比
    while (queue1.length && queue2.length) {
        // 拿到队首
        const pTop = queue1.shift();
        const qTop = queue2.shift();
        // 对比判断, 符合则提前终止
        if (pTop.val !== qTop.val) return false;
        // 拿到下一层
        const pLeft = pTop?.left;
        const pRight = pTop?.right;
        const qLeft = qTop?.left;
        const qRight = qTop?.right;
        // 进入判断, 符合则提前终止
        if ((pLeft && !qLeft) || (!pLeft && qLeft)) return false;
        if ((pRight && !qRight) || (!pRight && qRight)) return false;
        // 进入队列
        if (pLeft) queue1.push(pLeft);
        if (pRight) queue1.push(pRight);
        if (qLeft) queue2.push(qLeft);
        if (qRight) queue2.push(qRight);
    }
    // 最终结果对比
    return !queue1.length && !queue2.length;
}
  • 这里换一种广度优先遍历来对比两棵树是否相同
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

http://www.kler.cn/a/146253.html

相关文章:

  • Android 项目依赖冲突问题:Duplicate class found in modules
  • Vue数据响应式,reaction,ref的使用
  • turtle教学课程课堂学习考试在线网站
  • 云消息队列 Kafka 版 V3 系列荣获信通院“云原生技术创新标杆案例”
  • [0242].第4-3章:SpringBoot2核心技术笔记
  • 精选算法合集
  • 学位论文撰写-经验
  • Vue路由器(详细教程)
  • ***Linux下Mysql的安装
  • uni-app - 去除隐藏页面右侧垂直滚动条
  • 实现简单的操作服务器和客户端(下)
  • 在 Banana Pi BPI-R2 PRO RK3568开源路由器上安装 OpenWrt 23 快照固件
  • Bean的创建过程源码
  • 2824. 统计和小于目标的下标对数目 : 详解 “左找右“ “右找左“ 两种方式
  • 快速上手Banana Pi BPI-R4 MediaTek MT7988A 开源路由器开发板
  • C语言基础篇5:指针(一)
  • STM32使用多路PWM注意事项
  • 一个tomcat中部署的多个war,相当于几个jvm
  • AttributeError: ‘_OpNamespace‘ ‘image‘ object has no attribute ‘read_file‘解决
  • 免费部署开源大模型
  • 人脑工作机制 基本工作原理 神经元 神经网络 学习和记忆 和身体的互动 模仿游戏
  • 2023.11.25电商项目平台建设2 -四大业务之核销主题建模
  • 计算机毕业设计 基于SpringBoot的智能停车场计费系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 3.OpenResty系列之Nginx反向代理
  • 推荐你一个基于Koin, Ktor Paging等组件的KMM Compose Multiplatform项目
  • 内衣洗衣机怎么选?内衣洗衣机便宜好用的牌子推荐