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

news2024/11/25 22:42:24

题目链接及描述

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.coloradmin.cn/o/1827476.html

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

相关文章

【健身经验】2 圆肩

1、普拉提是针对小肌肉群锻炼&#xff0c;可以改善圆肩&#xff0c;圆肩就是因为背部没有力量&#xff0c;胸前也没有力量&#xff0c;因为平常没有用到这些肌肉 普拉提会用到小肌肉群&#xff0c;对于体态的纠正会比较好 2、肩背形态其实是发力问题&#xff0c;可以练习&…

springboot优雅shutdown时如何保障异步线程的安全

我前面写了一篇springboot优雅shutdown的文章&#xff0c;看起来一切很美好。 https://blog.csdn.net/chenshm/article/details/139640775 那是因为没有进行多线程测试。如果一个请求中包括阻塞线程&#xff08;主线程&#xff09;和非阻塞线程&#xff08;异步线程&#xff09…

“二分图匹配策略:匈牙利算法详解与应用实践“

二分图的最大匹配 给定一个二分图&#xff0c;其中左半部包含 &#x1d45b;1 个点&#xff08;编号 1∼&#x1d45b;1&#xff09;&#xff0c;右半部包含&#x1d45b;2 个点&#xff08;编号1∼&#x1d45b;2&#xff09;&#xff0c;二分图共包含 &#x1d45a; 条边。 …

ollama 多模态llava图像识别理解模型使用

参考: https://llava-vl.github.io/ https://ollama.com/blog/vision-models https://blog.csdn.net/weixin_42357472/article/details/137666022 下载: ollama run llava:13bcli使用 图片地址前面空格就行 describe this image: /ai/a1.jpg

最新版点微同城源码34.7+全套插件+小程序前后端(含安装教程)

模板挺好看的 带全套插件 自己耐心点配置一下插件 可以H5可以小程序 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89394996 更多资源下载&#xff1a;关注我。

维度建模中的事实表设计原则

维度建模是一种数据仓库设计方法&#xff0c;其核心是围绕业务过程建立事实表和维度表。事实表主要存储与业务过程相关的度量数据&#xff0c;而维度表则描述这些度量数据的属性。 以下是设计事实表时需要遵循的几个重要原则&#xff0c;来源于《维度建模》那本书上&#xff0…

正解 x86 Linux 内存管理

1&#xff0c;机器解析的思路 发现网络上大量的教程&#xff0c;多是以讹传讹地讲解 Linux 内存管理&#xff1b; 都是在讲&#xff1a; 逻辑地址 -> 线性地址 -> 物理地址 这个转换关系是怎么发生的。 上面这个过程确实是程序运行时地址的翻译顺序&#xff1b; …

Java课程设计:基于Javaweb的校园订餐系统

文章目录 一、项目介绍二、项目技术栈三、核心代码四、项目展示五、源码获取 一、项目介绍 在当今互联网高速发展的时代,大学校园内的学生生活正在发生着翻天覆地的变化。其中,校园内的餐饮服务无疑是亟需改革和创新的领域之一。 传统的校园食堂模式,往往存在就餐高峰时段拥挤…

[Cloud Networking] SPDY 协议

文章目录 1. 背景2. SPDY 之前3. SPDY 项目目标4. SPDY 功能特点4.1 SPDY基本功能4.2 SPDY高级功能 1. 背景 TCP是通用的、可靠的传输协议&#xff0c;提供保证交付、重复抑制、按顺序交付、流量控制、拥塞避免和其他传输特性。 HTTP是提供基本请求/响应语义的应用层协议。 不…

ubuntu 22.04下载和安装

ubuntu镜像: https://www.releases.ubuntu.com/22.04/ 然后下载vmwareworkstation16 密钥 ZF3R0-FHED2-M80TY-8QYGC-NPKYF

fiddler打开后,requests无法使用

Fiddler实用小技巧 错误情况 打开fiddler后&#xff0c;requests无法请求 requests.exceptions.ProxyError: HTTPSConnectionPool(hosth5api.m.taobao.com, port443): 说明 其实这是一个很小的坑&#xff0c;确也是一个很常见的坑。 在打开fiddler后&#xff0c;根据fiddle…

Linux笔记--ubuntu文件目录+命令行介绍

文件目录 命令行介绍 当我们在ubuntu中命令行处理位置输入ls后会显示出其所有目录&#xff0c;那么处理这些命令的程序就是shell&#xff0c;它负责接收用户的输入&#xff0c;并根据输入找到其他程序并运行 命令行格式 linux的命令一般由三部分组成&#xff1a;command命令、…

Cheat Engine CE v7.5 安装教程(专注于游戏的修改器)

前言 Cheat Engine是一款专注于游戏的修改器。它可以用来扫描游戏中的内存&#xff0c;并允许修改它们。它还附带了调试器、反汇编器、汇编器、变速器、作弊器生成、Direct3D操作工具、系统检查工具等。 一、下载地址 下载链接&#xff1a;http://dygod/source 点击搜索&…

微信小程序毕业设计-实验室管理系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

为什么用SDE(随机微分方程)来描述扩散过程【论文精读】

为什么用SDE(随机微分方程)来描述扩散过程【论文精读】 B站视频&#xff1a;为什么用SDE(随机微分方程)来描述扩散过程 论文&#xff1a;Score-Based Generative Modeling through Stochastic Differential Equations 地址&#xff1a;https://doi.org/10.48550/arXiv.2011.13…

读AI新生:破解人机共存密码笔记02进化

1. 人工智能的标准模型 1.1. 机器优化人类提供的固定目标 1.1.1. 是一条死胡同 1.1.1.1. 当你走进死胡同时&#xff0c;你最好掉头返回&#xff0c;找出走错的地方 1.2. 问题不在于我们可能无法做好构建人工智能系统的工作&…

LeetCode --- 401周赛

题目列表 3178. 找出 K 秒后拿着球的孩子 3179. K 秒后第 N 个元素的值 3180. 执行操作可获得的最大总奖励 I 3181. 执行操作可获得的最大总奖励 II 一、找出K秒后拿着球的孩子 这题可以直接模拟&#xff0c;从前往后&#xff0c;再从后往前走k次&#xff0c;最后直接返回…

小红书教程简化版,从0开始走向专业,小红书-主理人培养计划 (13节)

课程目录 1-小红书分析与拆解.mp4 2-小红书电商玩法.mp4 3-小红书基础信息设置10_1.mp4 4-小红书如何开店&#xff1f;.mp4 5-小红书店铺设置&#xff08;1&#xff09;.mp4 5-小红书店铺设置.mp4 6-小红书笔记制作与产品发布.mp4 7-小红书运营的文案与标题.mp4 8-小红…

网络编程(二)TCP

一、TCP网络编程 网络编程模型&#xff1a; C/S模型&#xff1a;客户端服务器模型 优点&#xff1a; 客户端可以缓存一些数据&#xff0c;使用时直接在本地读取&#xff0c;无需每次重新下载&#xff1b; 由于客户端和服务器都是自己开发的&#xff0c;可以自定义协议 缺点&a…

数据结构C语言版:顺序表基本操作的实现

参考教材&#xff1a;数据结构C语言版&#xff08;严蔚敏&#xff0c;吴伟民编著&#xff09; 目录 线性表的基本操作&#xff1a; 1&#xff1a;线性表L的初始化(参数用引用) 2&#xff1a;销毁线性表L 3&#xff1a;清空线性表L 4&#xff1a;求线性表L的长度 5&#xf…