哈希表、递归在二叉树中的应用-1372. 二叉树中的最长交错路径

题目链接及描述

1372. 二叉树中的最长交错路径 - 力扣(LeetCode)

题目分析

        题目所述,计算在二叉树中交替遍历的最大深度【左->右->左】【右->左->右】,例如对于从当前根节点root出发,则此时遍历方向有两个,左、右,同时当前路径走向影响下一步路径的走向(下一步路径走向必须和当前这一步路径走向相反)为了实现这个功能,编写一个方法,传入当前根节点的同时,传入一个标志位 flag,根据标志位判断 flag 的走向。

  • 若:flag == 1,则此步走向为left,同时递归调用时传入 -flag。实现转向的功能。
  • 同理:若:flag == -1,则此步走向为 right,同时递归调用时传入 -flag。

        编写函数实现如下:

    public int getMaxPaths(TreeNode root, int flag){if(root == null){return 0;}int ans = 0;if(flag == 1){ans = 1 + getMaxPaths(root.left, -flag);}else if(flag == -1){ans = 1 + getMaxPaths(root.right, -flag);}return ans;}

         上面所述函数可以计算出当前节点 root ,在flag 分别为 1 和 -1 时对应的最大交替深度。

        此时编写整体代码如下:

class Solution {public int longestZigZag(TreeNode root) {if(root == null){return 0;}int ans = Math.max(getMaxPaths(root, 1), getMaxPaths(root, -1)) - 1;return Math.max(ans, Math.max(longestZigZag(root.left), longestZigZag(root.right)));}public int getMaxPaths(TreeNode root, int flag){if(root == null){return 0;}int ans = 0;if(flag == 1){ans = 1 + getMaxPaths(root.left, -flag);}else if(flag == -1){ans = 1 + getMaxPaths(root.right, -flag);}return ans;}
}

         如果此前对二叉树的递归调用有所了解,很容易发现此种写法中存在大量的冗余调用:

        对于上图中所示节点,在此树的遍历过程中就会被调用三次,节点越靠近下面,被重复调用的次数就越多,同时随着树的深度的增大,被循环调用的节点个数也会越来越多。

         运行上面所写代码,不难发现代码超时,并不能通过所有的测试用例。

        如何优化:借助HashMap,将已经遍历到的节点的最大交错深度存储起来,此时又产生了新的问题,对于当前某节点 cur 而言,他的运行方向有左和右,显示将 cur 作为HashMap的key存储起来并不能达到想要的效果,此时如果设计key ,进一步思考可以将 root + "_" + flag 作为HashMap的 key,value 为对应的交错深度,这样完美解决了某个 Key 对应遍历有左、右两种情况的场景。

代码编写

class Solution {public Map<Object, Integer> map = new HashMap<>();public int longestZigZag(TreeNode root) {if(root == null){return 0;}int ans = Math.max(getMaxPaths(root, 1), getMaxPaths(root, -1)) - 1;return Math.max(ans, Math.max(longestZigZag(root.left), longestZigZag(root.right)));}public int getMaxPaths(TreeNode root, int flag){if(map.containsKey(root + "_" + flag)){return map.get(root + "_" + flag);}if(root == null){return 0;}int ans = 0;if(flag == 1){ans = 1 + getMaxPaths(root.left, -flag);}else if(flag == -1){ans = 1 + getMaxPaths(root.right, -flag);}map.put(root + "_" + flag, ans);return ans;}
}

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

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

相关文章

今日成果2024-6-7 TrustZone TEE安全SDK开发指南

Rockchip Vendor Storage Application Note.pdf OK 开机下&#xff0c;可以实现Vendor Storage的读写。 0ms时同步RTC时间 OK Rockchip_Developer_Guide_TEE_SDK_CN.pdf 什么是TrustZone 此系统方法意味着可以保护安全内存、加密块、键盘和屏幕等外设&#xff0c;从而可确…

视频剪辑可以赚钱吗 快速学会视频剪辑的方法

由于视频剪辑的需求不断增长&#xff0c;学会视频剪辑成为一项自媒体必备的技能&#xff0c;这个技能可以为个人带来收入和职业发展带来机会。无论是作为自由职业者还是在公司工作&#xff0c;掌握视频剪辑技能都可以为你提供更多的工作机会和竞争优势。这篇文章将讲解视频剪辑…

springboot事务管理的机制是什么

SpringBoot的事务管理机制实质上是基于Spring框架的事务处理机制。其主要目的是确保一系列数据库操作要么全部成功&#xff0c;要么全部失败&#xff08;回滚&#xff09;&#xff0c;从而维护数据的完整性和一致性。 SpringBoot事务管理遵循ACID四大特性&#xff1a; 1、原子…

VBA,VB6 LIKE 运算符有哪些转义符?

在 VB6 中&#xff0c;LIKE 运算符主要使用以下转义符&#xff1a; *&#xff1a;表示匹配任意字符序列&#xff08;包括空字符序列&#xff09;。 ?&#xff1a;表示匹配任意单个字符。 [ ]&#xff1a;用于表示字符范围。例如&#xff0c;[a-z] 表示匹配从小写字母 a 到 z …

前端将Markdown文本转换为富文本显示/编辑,并保存为word文件

参考&#xff1a;https://www.wangeditor.com/ https://blog.csdn.net/weixin_43797577/article/details/138854324 插件&#xff1a; markdown-it traptitech/markdown-it-katex markdown-it-link-attributes highlight.js wangeditor/editor wangeditor/editor-for-vue html…

2.深度学习-线性回归

文章目录 环境配置&#xff08;必看&#xff09;线性回归代码工程运行结果1.对比图2.运行结果 环境配置&#xff08;必看&#xff09; Anaconda-创建虚拟环境的手把手教程相关环境配置看此篇文章&#xff0c;本专栏深度学习相关的版本和配置&#xff0c;均按照此篇文章进行安装…

Carsim高级开发:VS Connect通讯开发指南

文章目录 前言一、VS Connect 概念引入二、VS Connect 通讯框架三、Carsim 工程配置1、车辆模型配置2、procedure配置3、Run Control配置4、受控车辆名称配置 四、VS Connect Server代码1、打开Sln工程2、代码修改 五、VS Connect Client代码1、函数的调用关系2、carsim_variab…

目录深度探索

目录 文件控制块和索引节点 索引节点&#xff08;Inode&#xff09; 结构比较 简单文件目录 目录和文件控制块 线性结构的目录 优点和缺点 使用场景 树形目录 树形目录的基本概念 树形目录的优势 树形目录的具体应用 案例分析&#xff1a;多层次目录结构 无环图目…

MySQL 8.0开始引入了开窗函数,使得SQL语句能够以更复杂的方式操作数据集。

在MySQL中使用ROW_NUMBER()函数时&#xff0c;可以通过一个简单的图表来帮助理解它是如何工作的。以下是对ROW_NUMBER()函数的图解说明&#xff1a; 假设我们有一个名为employees的表&#xff0c;其中包含以下列&#xff1a;employee_id&#xff08;员工ID&#xff09;&#x…

C语言线条样式和填充样式都有哪些? 怎样设置?

一、问题 线条样式和填充样式都有哪些&#xff1f;该怎样设置&#xff1f; 二、解答 在画图前&#xff0c;要先设置线条样式和填充样式&#xff0c;它们直接决定图形的显⽰效果。 1.线条样式 (1) setlinestyle( ) 函数。 void far setlinestyle(int linestyle, unsigned upa…

5G消息 x 文旅 | 一站式智慧文旅解决方案

5G消息 x 文旅 | 一站式智慧文旅解决方案 文旅 x 5G 消息将进一步强化资源整合&#xff0c;满足游客服务需求、企业营销需求、政府管理需求&#xff0c;推进文化旅游项目的智慧化、数字化&#xff0c;增强传播力、竞争力和可持续性。5G 消息的“原生入口”、“超强呈现”、“智…

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第十周) - 自然语言处理应用

自然语言处理应用 1. 问答系统 1.1. 信息检索1.2. 机器阅读理解1.3. 多跳问答 2. 对话系统3. 机器翻译4. 文本摘要 1. 问答系统 在自然语言处理领域&#xff0c;问答系统(Question Answering&#xff0c;QA)是一个广泛且重要的研究方向&#xff0c;其目的是让计算机根据给定的…

Unity3D TextMeshPro组件使用及优化详解

在Unity3D游戏开发中&#xff0c;文本渲染是一个不可或缺的部分。而TextMeshPro作为Unity的一个插件&#xff0c;提供了更高质量、更灵活的文本渲染功能&#xff0c;为开发者带来了极大的便利。本文将详细介绍TextMeshPro组件的使用技巧以及优化方法&#xff0c;并通过代码实例…

红队攻防渗透技术实战流程:组件安全:JacksonFastJsonXStream

红队攻防渗透实战 1. 组件安全1.1 J2EE-组件Jackson-本地demo&CVE1.1.1 代码执行 (CVE-2020-8840)1.1.2 代码执行(CVE-2020-35728)1.2 J2EE-组件FastJson-本地demo&CVE1.2.1 FastJson <= 1.2.241.2.2 FastJson <= 1.2.471.2.3 FastJson <= 1.2.801.3 J2EE-组…

帕金森病的食疗建议

帕金森病&#xff08;PD&#xff09;是一种慢性、进展性的神经退行性疾病&#xff0c;主要影响中老年人。虽然目前尚无法根治&#xff0c;但及早规范治疗可显著改善症状&#xff0c;提高患者的生活质量。饮食调理作为帕金森病综合治疗的重要组成部分&#xff0c;对于维持患者较…

jQuery中.text() 和 .val()辨析

在jQuery中&#xff0c;.text() 和 .val() 是两个用于操作DOM元素内容的常用方法&#xff0c;但它们有不同的用途和适用的元素类型。 .text() .text() 方法用于获取或设置匹配元素的文本内容。适用于以下元素&#xff1a; 普通HTML元素&#xff08;如<div>&#xff0c…

接口测试详解

接口测试详解 本文主要讲软件接口 一、什么是接口&#xff1f;硬件接口&#xff1a;硬件接口指的是硬件提供给外界的一种实体。主要作用是内部数据分离出外 部的沟通方法 目的是&#xff1a;沟通外部来改变内部的数据。如&#xff1a;USB接口&#xff0c;投影仪接口 软件接口…

速盾:linux防止ddos攻击

Linux作为一种开源操作系统&#xff0c;被广泛应用于服务器和网络设备中。然而&#xff0c;正因为其广泛使用&#xff0c;Linux服务器经常成为黑客和攻击者的目标。DDoS&#xff08;分布式拒绝服务&#xff09;攻击是一种常见的攻击方式&#xff0c;旨在通过大量恶意流量淹没目…

【CDN】逆天 CDN !BootCDN 向 JS 文件中植入恶意代码

今天在调试代码&#xff0c;突然控制台出现了非常多报错。 这非常可疑&#xff0c;报错指向的域名也证实了这一点。 因为我的 HTML 中只有一个外部开源库&#xff08;qrcode.min.js&#xff09;&#xff0c;因此只有可能是它出现了问题。 我翻看了请求记录&#xff0c;发现这…

Java -jar 运行 报 MalformedInputException: Input length = 1

Intellij IDEA 中运行正常&#xff0c;linux 运行正常&#xff0c; cmd 下运行 报&#xff1a;MalformedInputException: Input length 1 微服务项目&#xff0c;在Nacos中做了配置&#xff0c;在引用 Nacos中配置时&#xff0c;编码问题&#xff0c;导致的错误 org.yaml.sna…