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

Leetcode Hot 100 | 543.二叉树的直径 | 递归+优化

写法一

自己一开始直接写的,没考虑时间复杂度…

class Solution {/*递归思路:不准进递归(除非之后用简单例子验证一下)将方法按照自己想要返回的值来补充其他的代码细节;用最值来模拟返回结果+补充代码细节(最高和最低);再用简单例子走一遍全过程修改代码*///计算对当前结点来说的最大直径 【递归调用】public int diameterOfBinaryTree(TreeNode root) {//【边界用最低来模拟】if(root == null)return 0;//【用最高来模拟】//算当前结点的最大直径int res1 = maxHeight(root.left)+maxHeight(root.right);//算当前结点的左子结点的最大直径int res2 = diameterOfBinaryTree(root.left);//算当前结点的右子结点的最大直径int res3 = diameterOfBinaryTree(root.right);//三个值里面取最大值int res4 = Math.max(res1,res2);int res = Math.max(res3,res4);//返回直径最大值return res;}// 计算当前结点到其左结点(或右结点)最底端的最长高度 (经过的枝) 【递归调用】// 【其实准确计算的是当前结点到其左结点(或右结点)最底端经过的最多的结点 【只不过结点比树枝少1 (2结点=1树枝) ;(刚好在调用处就不用再+1了(即不用算连接根的那个枝了))】】public int maxHeight(TreeNode node){//【边界用最低来模拟】if(node == null)return 0;//【用最高来模拟】int res1 = maxHeight(node.left);int res2 = maxHeight(node.right);return Math.max(res1,res2)+1;}
}

时间和内存:
在这里插入图片描述

写法二:优化了下

class Solution {public int res = 0;public int diameterOfBinaryTree(TreeNode root) {/*** 和法一写的区别:*  1.该函数只负责调用不负责返回值;方法一函数负责返回值,在调用处才计算 【能在函数内实现就在函数内实现,简单高效快捷美观】*  2.该函数传入的是root,直接内部递归计算左右结点了(不用返回root值,最多就返回到root的左右子结点,刚好能计算以root为根的直径);方法一传入的是左右结点,而且还递归传入...【这个方法的优化高效省内存节省时间】*  3.该方法的res是全局变量,递归一次就能计算好(边递归边计算的);方法一的res是全部递归之后才算的,每次都递归root和左右根的计算...【太耗了,这个的一次递归计算更方便!】*///传root进去,只是递归计算其所有左结点(右结点)数量【即以root为根的树杈】culculateDiameter(root);return res;}/*(假设左边有三道左结点)当前结点返回给上一层结点包括当前结点在内的所有子结点的个数 = 当前的层数 = 对上一层结点来说接收的就是以上一层结点为根的所有树杈数量即:结点数 = 层数 = 杈数+1 ; 深度 = 层数 , 长度 = 杈数*///这里最多用到root的左右子结点的返回值返回完就结束了,最后一次返回值给调用处的root没用,所以虽然计算的是结点数,但用到的还是结点数-1=树杈数public int culculateDiameter(TreeNode node){if(node == null) return 0;int l = culculateDiameter(node.left);int r = culculateDiameter(node.right);res = Math.max(res,l+r);return Math.max(l,r)+1;}}

浅优化了一点耗时
在这里插入图片描述

后续有别的方法或优化写法再补充

相关文章:

  • python.tkinter设计标记语言(渲染6-暂停与跳过渲染)
  • Arweave 出块流程详解
  • 【优选算法】(第十一篇)
  • 排水系统C++
  • 对象存储极简理解(对象、存储桶)
  • kubeadm部署k8s集群,版本1.23.6;并设置calico网络BGP模式通信,版本v3.25--未完待续
  • Java基础 3. 面向对象
  • DevExpress WinForms中文教程:Data Grid - 如何添加或删除行?
  • 浏览器插件的标准项目结构通常包括以下几个目录和文件
  • c语言手撕内存池组件
  • 利用Puppeteer-Har记录与分析网页抓取中的性能数据
  • 网络安全 DVWA通关指南 DVWA Weak Session IDs(弱会话)
  • C++中数据类型的大小
  • 【spring中event】事件简单使用
  • 【MySQL】数据目录迁移
  • HTTP 简介
  • httpie使用详解
  • JavaScript异步流程控制的前世今生
  • Python_网络编程
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 大快搜索数据爬虫技术实例安装教学篇
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 小程序开发中的那些坑
  • 在Docker Swarm上部署Apache Storm:第1部分
  • k8s使用glusterfs实现动态持久化存储
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 带你开发类似Pokemon Go的AR游戏
  • 说说我为什么看好Spring Cloud Alibaba
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #include到底该写在哪
  • #面试系列-腾讯后端一面
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (多级缓存)缓存同步
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一) storm的集群安装与配置
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • ******之网络***——物理***
  • ***检测工具之RKHunter AIDE
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .net 微服务 服务保护 自动重试 Polly
  • .NetCore 8 SwaggerGen 显示接口注析
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET周刊【7月第4期 2024-07-28】
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [100天算法】-二叉树剪枝(day 48)
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [Android] Amazon 的 android 音视频开发文档
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [C]编译和预处理详解