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

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;
    }

}

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

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


http://www.kler.cn/news/327293.html

相关文章:

  • 【人人保-注册安全分析报告-无验证方式导致安全隐患】
  • 项目:微服务即时通讯系统客户端(基于C++QT)]四,中间界面搭建和逻辑准备
  • git使用“保姆级”教程3——添加暂存区及提交本地库
  • 苹果手机如何录屏?IOS 自带工具与嗨格式录屏大师 APP 详解
  • 只写CURD后台管理的Java后端要如何提升自己
  • RabbitMQ的应用问题
  • ansible学习之 Facts
  • Python知识点:如何使用EdgeX Foundry与Python进行边缘计算
  • 使用iTextPDF库时,设置文字为中文格式
  • 基于微信小程序的美食推荐系统
  • 鸿蒙NEXT入门到实战(基于最新api12稳定版)
  • DevExpress WinForms中文教程:Data Grid - 如何添加或删除行?
  • 基于springboot的评分评教管理系统
  • C#进阶-读写Excel常用框架及其使用方式
  • Edge SCDN:安全与速度并进的解决方案
  • C嘎嘎入门篇:类和对象(2)
  • JVM运行情况预估
  • 分库分表还是分布式?如何用 OceanBase的单机分布式一体化从根本上解决问题
  • 从Elasticsearch到RedisSearch:探索更快的搜索引擎解决方案
  • 回归预测|基于小龙虾优化LightGBM的数据回归预测Matlab程序COA-LightGBM 多特征输入单输出 含基础模型
  • SQL Server 分页查询的学习文章
  • 通信工程学习:什么是CSMA/CA载波监听多路访问/冲突避免
  • sql server连接池爆满排查解决定位
  • 【JavaEE】——多线程常用类和常用数据结构(精华长文)
  • 【NTN 卫星通信】基于NR的NTN RAN架构
  • 【Orange Pi 5嵌入式应用编程】-用户空间UART通信
  • 相亲交友系统的社会影响:家庭结构的变化
  • TFTP协议
  • linux中使用docker命令时提示权限不足
  • 十七、触发器