哈希表、递归在二叉树中的应用-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.mfbz.cn/a/713326.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

持续集成jenkins+gitee

首先要完成gitee部署&#xff0c;详见自动化测试git的使用-CSDN博客 接下来讲如何从git上自动拉取代码&#xff0c;实现jenkins无人值守&#xff0c;定时执行测试&#xff0c;生成测试报告。 需要这三个安装包 由于目前的jenkins需要至少java11到java17的版本&#xff0c;所以…

JavaScript——初识:JavaScript的组成、输入和输出语句... | JavaScript基础:变量,数据类型转换

目录 初识JavaScript JavaScript的组成 输入和输出语句 ECMAScript 6保留关键字 变量的命名规范 注意事项 JavaScript基础 变量的数据类型 数据类型分类 数据类型转换 转换为字符串型 转换为数字型 转换为布尔型 例题 初识JavaScript JavaScript的组成 Java…

搭建自己的AI模型应用网站:JavaScript + Flask-Python + ONNX

1. 前言 本文作者以一个前端新手视角&#xff0c;部署自己的神经网络模型作为后端&#xff0c;搭建自己的网站实现应用的实战经历。目前实现的网页应用有&#xff1a; AI 语音服务主页AI 语音识别AI 语音合成AI CP号码生成器 欢迎大家试用感受&#xff0c;本文将以博客基于G…

大数据—“西游记“全集文本数据挖掘分析实战教程

项目背景介绍 四大名著&#xff0c;又称四大小说&#xff0c;是汉语文学中经典作品。这四部著作历久不衰&#xff0c;其中的故事、场景&#xff0c;已经深深地影响了国人的思想观念、价值取向。四部著作都有很高的艺术水平&#xff0c;细致的刻画和所蕴含的思想都为历代读者所…

MyBatis使用 PageHelper 分页查询插件的详细配置

1. MyBatis使用 PageHelper 分页查询插件的详细配置 文章目录 1. MyBatis使用 PageHelper 分页查询插件的详细配置2. 准备工作3. 使用传统的 limit 关键字进行分页4. PageHelper 插件&#xff08;配置步骤&#xff09;4.1 第一步&#xff1a;引入依赖4.2 第二步&#xff1a;在m…

河南省文化旅游发展相关统计数据(2014-2023年)

数据时间&#xff1a;2014-2023年&#xff0c;近10年 数据格式&#xff1a;excel 数据来源&#xff1a;中国旅游统计年鉴、河南省统计公报 数据内容&#xff1a;包括河南省近10年来游客量、旅游总收入、旅游景区数量&#xff08;包括A级&#xff09;、星级酒店数、旅行社数、公…

mongodb-java apispringboot整合mongodb

mongodb入门mongodb-java api的使用springboot整合mongodb评论 一 MongoDB 1.1 MongoDB简介 ​ MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 ​ MongoDB是一个介于关系数据库和非关系数据库之间的产品&…

双链表——AcWing.827双链表

双链表 定义 双链表是链表的一种&#xff0c;它的每个节点有两个指针&#xff0c;一个指向前一个节点&#xff0c;一个指向后一个节点。这样使得链表可以双向遍历。 运用情况 频繁进行前后双向遍历操作时非常有用&#xff0c;比如在一些需要来回移动处理数据的场景。可以方…

嵌入式学习——Linux高级编程复习(TCP编程)——day44

基于TCP聊天: clientA.c clientB.c socket socket connect bind listen acce…

2024年了! 为什么还在用串口服务器?

在数字化飞速发展的2024年&#xff0c;串口服务器这一看似古老的技术仍然在工业自动化、远程监控和数据通信等领域发挥着重要作用。本文将从串口服务器的定义、功能、优势和使用场景四个方面来探讨&#xff0c;为什么串口服务器在今天仍然被广泛使用。 1. 什么是串口服务器 串口…

基于51单片机的红外计数器-1602显示

一.硬件方案 本设计的主要原理为&#xff1a;红外发射管发射红外线&#xff0c;红外接收管接收红外线&#xff0c;并且接收管当有红外线照射的时候&#xff0c;电阻比较小&#xff0c;当无线外线照射的时候电阻比较大&#xff0c;这样就可以通过一个电压比较器和一个基准电压进…

线程池ThreadPoolExecutor使用指南

线程池ThreadPoolExecutor使用指南 &#x1f9d0;使用线程池的好处是什么&#xff1f; 统一管理&#xff0c;减少资源获取创建的开销&#xff0c;提高利用率。 &#x1f527;线程池的参数 ​ThreadPoolExecutor​ 3 个最重要的参数&#xff1a; ​corePoolSize​ : 任务队列…

Linux系统编程:基础IO

目录 1.C语言文件回顾 2.系统文件I/O 2.1 系统接口介绍 2.2 文件描述符fd 2.3 重定向 2.4 理解缓冲区 2.5 理解文件系统 1.C语言文件回顾 在学习系统文件的操作之前&#xff0c;还记得C语言是如何进行对文件的操作的吗&#xff1f;下面看C语言接口&…

浪潮信息打造业界首款50℃进液温度服务器 PUE逼近理论极限1.0!

在科技飞速发展的今天&#xff0c;浪潮信息以其前瞻性的技术创新思维&#xff0c;再次突破行业极限&#xff0c;推出业界首个支持50℃进液温度的浸没式液冷服务器NF5180G7。这一创新成果不仅展现了浪潮信息在液冷技术领域的深厚实力&#xff0c;更标志着服务器冷却技术的一次重…

【2024亲测无坑】在Centos.7虚拟机上安装Oracle 19C

目录 一、安装环境准备 1、linux虚拟机安装 2、虚拟机快照 3、空间检查&软件上传 二、Oracle软件安装 1.preinstall安装及其他配置准备 2.oracle安装 三、数据库实例的安装 1.netca——网络配置助手 2.dbca——数据库配置助手 四、ORACLE 19C 在linux centos 7上…

基于PPO的强化学习超级马里奥自动通关

目录 一、环境准备 二、训练思路 1.训练初期&#xff1a; 2.思路整理及改进&#xff1a; 思路一&#xff1a; 思路二&#xff1a; 思路三&#xff1a; 思路四&#xff1a; 3.训练效果&#xff1a; 三、结果分析 四、完整代码 训练代码&#xff1a; 测试代码&#…

MySQL 日志(二)

本篇将继续介绍MySQL日志的相关内容 目录 一、二进制日志 简介 注意事项 删除二进制日志 查看二进制日志 二进制日志的格式 二、服务器日志维护 一、二进制日志 简介 二进制日志中主要记录了MySQL的更改事件&#xff08;不包含SELECT和SHOW),例如&#xff1a;表的…

Base64编码的工作原理与实际应用

目录 前言 一、什么是Base64编码&#xff1f; 二、Base64编码的原理 三、Base64编码的应用场景 四、为什么要使用Base 64 五、Base64加密解密的实现 前言 当你需要将二进制数据转换为可传输和存储的文本格式时&#xff0c;Base64编码是一个常用的选择。在这篇博客中&#…

C++ 51 之 继承中的构造和析构

对象构造和析构的调用原则 继承中的构造和析构 子类对象在创建时会首先调用父类的构造函数父类构造函数执行完毕后&#xff0c;才会调用子类的构造函数当父类构造函数有参数时&#xff0c;需要在子类初始化列表(参数列表)中显示调用父类构造函数析构函数调用顺序和构造函数相…

可以用来制作硬模空心耳机壳的胶粘剂有哪些种类?

可以用来制作硬模空心耳机壳的胶粘剂有哪些种类&#xff1f; 制作耳机壳的胶粘剂有很多种类&#xff0c;常见的有环氧树脂胶水、UV树脂胶、快干胶、热熔胶等。 这些胶粘剂都有不同的特点和适用场景&#xff0c;可以根据自己的需求选择合适的类型。 例如&#xff1a; 环氧树脂…