学习记录:js算法(四十七):相同的树

news2024/12/23 14:04:32

文章目录

    • 相同的树
      • 我的思路
      • 网上思路
        • 队列
        • 序列化方法
    • 总结

相同的树

给你两棵二叉树的根节点 pq ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

图一:
在这里插入图片描述

图二:
在这里插入图片描述

图三:
在这里插入图片描述

示例 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

我的思路
递归
网上思路

我的思路

var isSameTree = function (p, q) {
    if (p === null && q === null) {
        return true;
    }
    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);
};

讲解
基本情况:

  • 如果 p 和 q 都是 null,返回 true。
  • 如果只有一个是 null,返回 false。
  • 如果两个节点的值不同,返回 false。
    递归:
  • 递归调用 isSameTree 来比较左子树和右子树。
  • 只有当左子树和右子树都相同时,整个树才相同。

网上思路

队列
 var isSameTree = function (p, q) {
    const queue = [[p, q]]; // 初始化队列,存储节点对

    while (queue.length > 0) {
        const [node1, node2] = queue.shift(); // 从队列中取出一对节点

        // 如果两个节点都是 null,继续比较下一个
        if (node1 === null && node2 === null) {
            continue;
        }
        // 如果只有一个节点是 null,或者值不同,返回 false
        if (node1 === null || node2 === null || node1.val !== node2.val) {
            return false;
        }

        // 将左右子节点加入队列
        queue.push([node1.left, node2.left]);
        queue.push([node1.right, node2.right]);
    }

    return true; // 如果遍历完成都没有发现不同,返回 true
}

讲解

  1. 初始化队列 创建一个队列,将两棵树的根节点 pq 成对放入队列。
  2. 循环遍历 当队列不为空时,进行以下操作:
    2.1. 取出节点对 从队列中取出一对节点 node1node2
    2.2. 检查是否都为 null 如果 node1node2 都是 null,继续下一对节点的比较。
    2.3. 检查是否有一个为 null 如果只有一个节点是 null,或两个节点的值不同,返回 false
    2.4. 入队左右子节点 如果两个节点都存在,将它们的左右子节点成对放入队列。
  3. 返回结果 如果队列处理完毕且没有发现不同,返回 true
序列化方法
var isSameTree = function (p, q) {
    function serialize(root) {
        if (root === null) {
            return 'null,'; // 用 'null' 表示空节点
        }
        // 先序遍历,节点值与左右子树的序列化结果
        return root.val + ',' + serialize(root.left) + serialize(root.right);
    }
    // 序列化两棵树并比较
    return serialize(p) === serialize(q);
};

讲解
序列化函数 serialize(root):

  • 编写一个辅助函数,将二叉树转换为字符串。可以使用前序遍历(pre-order traversal)来实现。
  • 如果当前节点是 null,返回字符串 ‘null,’。
  • 否则,返回当前节点的值与左右子树的序列化结果,使用逗号 , 分隔。
    主函数 isSameTree(p, q):
  • 调用 serialize 函数对两棵树进行序列化。
  • 比较两个序列化后的字符串,若相同则返回 true,否则返回 false。

总结

序列化的方法看起来挺不错的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2170495.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试工程师...我是如何正确地申请加薪的!

01 合理加薪,明确价值 突然有一天被人问到,你是怎么跟老板谈薪资和加薪的事情的? 我一愣,思考了一下,回想我这么些年工作,好像除了入职的时候跟老板讲过工资,其他的时候从没有主动跟老板或领导…

从数据到作图,三步教会你风向玫瑰图

很多小伙伴在用0rigin软件作风向玫瑰图时就卡在第一步,精准全面的风向数据去哪获取? 给大家推荐一个平台——羲和能源气象大数据平台,在这你不仅可以获取风向数据还能直接生成“风向玫瑰图”,一步到位! 步骤一:搜索“羲和能源气象大数据平…

CDGA|数据流通新策略:高效利用,解锁数字经济新动能

在数字化浪潮席卷全球的今天,数据已成为驱动经济社会发展的关键生产要素。随着大数据、云计算、人工智能等技术的飞速发展,数据的价值被无限放大,而如何高效地流通与利用这些数据,成为了摆在各行各业面前的重要课题。本文将探讨数…

vue.js——“微商城”后台管理系统

1. 需求背景: 先创建运行环境,“微商城”后台管理系统是一种后台管理系统平台,旨在提供一个便捷、安全和高效的管 理和操作各类数据的平台。系统将涵盖用户登录、商品管理、分类管理、新增分类和个人中 心等功能,以满足用户高效数据管理的各…

Vue2项目中vuex如何简化程序代码,提升代码质量和开发效率

Vuex为Vue中提供了集中式存储 库,其主要分为state、getter、mutation、action四个模块,它们每个担任了不同角色,分工不同;Vuex允许所有的组件共享状态抽取出来,以一个全局单例模式管理,状态集中存储在同一…

安装软件及apt install -f修复均报错

UOS统信安装软件过程及修复依赖过程,可排查deepin-installer和dpkg问题 文章目录 一、问题现象二、问题原因三、解决方案 一、问题现象 执行apt install -f 都会出现该报错,如图所示: 二、问题原因 造成这种情况的原因在于/var/lib/dpkg/…

视频生成模型哪家强?豆包可灵通义海螺全面评测【AI评测】

比较贴切的表述是,豆包的视频模型这次的升级,已然将国内AI视频的美学境界拔高了一个档次,让AI视频也开始变得更加实用了。 作者|斗斗 出品|产业家 国内的文生视频领域,也是吃上“细糠”了。 最近,火山引擎宣布豆…

必收藏,售后客服日常回复必备的话术 (精华版)

在售后客服工作中,使用恰当的话术对客户进行回复至关重要。本文精选了售后客服日常工作中必备的精华话术,旨在帮助客服人员提升回复效率和服务质量。其中包括客户投诉处理、问题解决、礼貌用语等多个方面的话术内容。 前言 在售后客服工作中&#xff0c…

Flux【lora模型】【禅意插画】:画风清新唯美,充满禅意韵味的插画模型:Zenpainting l 禅意插画

大家好我是安琪!!! 今天和大家推荐一款基于Flux训练的禅意插画风格的lora模型:Zenpainting l 禅意插画**。**此Lora模型可生成富禅意韵味的艺术插画,画风清新唯美,充满艺术意境。 提示词:Zen painting il…

URI和URL的区别

1: 将 URI 转换为 URL import java.net.URI; import java.net.URL;public class UriToUrlExample {public static void main(String[] args) {// 创建一个 URI 对象URI uri = new URI("http://example.com/path/to/resource");// 将 URI 转换为 URLtry {URL url = u…

C++:模板(1)

目录 实现泛型的交换函数 函数模板 1.概念 2.格式 3.原理 4.函数模板实例化 5.函数模板参数的匹配原则 类模板 1.定义格式 2.实例化 3.声明与定义问题 实现泛型的交换函数 我们实现一个对所有类型都通用的交换函数,可以用函数重载来实现。 void Swap(in…

Map和Set,TreeMap和TreeSet,HashMap和HashSet

文章目录 TreeSet和TreeMap二叉搜索树模拟TreeMAp定义 基本操作插入查找删除(难点)遍历性能分析应用场景 Map&&Set模型 HashMap常用方法 HashSet常用方法HashMap和HashSet区别数据结构不同元素类型不同方法不同使用场景不同 TreeSet和TreeMap 定义: TreeSe…

个人健康档案管理系统

基于springbootvue实现的个人健康档案管理系统(源码L文ppt)4-076 4.1 系统功能结构设计 根据对个人健康档案管理系统的具体需求分析,把系统可以划分为几个不同的功能模块:管理员可以对系统首页、用户管理、健康体检管理、疫…

智能密码、指纹锁语音芯片ic方案 可存放40s语音内容 NVD语音芯片

随着科技的飞速发展,智能家居安全领域迎来了前所未有的变革。智能密码与指纹锁作为现代家庭安全防护的重要一环,其背后的语音芯片IC开发更是这一变革中的关键技术突破。 智能密码、指纹锁语音芯片ic方案 选型与简介: NVD语音芯片是一款低成…

基于JAVA+SpringBoot+Vue的疫苗发布和接种预约系统

基于JAVASpringBootVue的疫苗发布和接种预约系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接&#x1f3…

AlmaLinux 安裝JDK8

在 AlmaLinux 上安装 JDK 8 可以通过包管理器 dnf 来完成。AlmaLinux 是基于 RHEL 的一个开源发行版,因此其包管理系统和 RHEL 类似。以下是详细的步骤来安装 OpenJDK 8 1. 更新系统包列表 sudo dnf update -y 2. 安装 OpenJDK 8 使用 dnf 安装 OpenJDK 8。你可…

【Python-tkinter】实现简单的文本编辑器(附带教程源码)

如果你也是刚入门的小伙伴呢,小编为你们准备了入门Python学习籽料和Python入门实践,点击领取(无偿获得) 利用tkinter实现简单的文本编辑器。创建一个简单的文本编辑器。可以用读文件的方式在一个文本域里显示一些文字供用户编辑…

大模型分布式训练并行技术(七)-自动并行

近年来,随着Transformer、MOE架构的提出,使得深度学习模型轻松突破上万亿规模参数,传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此,我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。 而利用AI集群&a…

5--苍穹外卖-SpringBoot项目中菜品管理 详解(一)

目录 公共字段自动填充 问题分析 实现思路 代码开发 步骤一 步骤二 功能测试 新增菜品 需求分析和设计 代码开发 文件上传接口 功能测试 1--苍穹外卖-SpringBoot项目介绍及环境搭建 详解-CSDN博客 2--苍穹外卖-SpringBoot项目中员工管理 详解(一&#…

医疗器械库存管理软件 符合gsp要求

软件介绍: 盘谷医疗器械进销存管理软件契合医疗器械行业特点,符合gsp要求,专为一二三类医疗器械经营企业开发的医疗器械进销存、质量验收、GSP管理、UDI扫码识别、财务管理一体化经营管理系统,符合药监新版医疗器械经营质量管理规…