代码随想录算法训练营 DAY 16 | 104.二叉树最大深度 111.二叉树最小深度 222.完全二叉树的节点个数

104.二叉树最大深度

深度和高度

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)

前序求的就是深度,用后序求的是高度。

在这里插入图片描述

根节点的深度,其实就是这棵树的最大高度!

  • 整体思路:按照后序遍历左右中的顺序,依次遍历每个节点,把它的高度返回给上一层父节点!最后回到根节点时就掌握了所有节点的高度信息!

递归法

递归三部曲:

  • 确定递归函数返回值和参数
int getHeight(TreeNode node)
  • 确定终止条件:
if(node == null) return 0;
  • 确定单层递归的逻辑

按照后序遍历左 右 中的顺序依次处理。每次返回给父节点(中)的时候 就代表了当前根节点的最大高度!!

int leftHeight = getHeight(node.left);  //左
int rightHeight = getHeight(node.right);  //右
int maxHeight = 1 + Math.max(leftHeight, rightHeight);

在这里插入图片描述

  • java代码
class Solution {
    public int getHeight(TreeNode node) {  //后序遍历
        if(node == null) return 0;  //结束条件
        int leftHeight = getHeight(node.left);  //左
        int rightHeight = getHeight(node.right);  //右
        int maxHeight = 1 + Math.max(leftHeight, rightHeight);
        return maxHeight;
    }

    public int maxDepth(TreeNode root) {
        return getHeight(root);
    }
}
  • 精简版
class solution {
public int maxDepth(TreeNode root) {
        if (root == null) return 0;
        return 1 + Math.Max(maxDepth(root.left), maxDepth(root.right));
    }
};

559.n叉树的最大深度

把左和右递归遍历的操作放到一个for循环里,遍历node.children 得到depth,最后return depth+1即可!

class Solution {
    public int getHeight(Node node) {
        if(node == null) return 0;
        int depth = 0;
        for(Node cur : node.children) {
            depth = Math.max(depth, getHeight(cur));
        }
        return 1 + depth;
    }

    public int maxDepth(Node root) {
        return getHeight(root);
    }
}

111.二叉树最小深度

前序遍历和后序遍历都可以,前序求的是深度,后序求的是高度。这里我们用后序。

明确题目定义!叶子节点是指左右孩子都为null的节点,因此我们在计算depth时就要添加条件判断,分别判断左为空右不为空左不为空右为空左右都不空的情况来计算当前最小深度!

后序遍历是左右中,从最底层开始一层层往上传递到根节点。

在这里插入图片描述

后序 递归

递归三部曲:

  • 确定递归函数返回值和参数
int getHeight(TreeNode node)
  • 确定终止条件:
if(node == null) return 0;
  • 确定单层递归的逻辑

分成三种情况:左为空右不为空左不为空右为空左右都不空。然后return 接收到的最小高度+1

int leftHeight = getHeight(node.left);
        int rightHeight = getHeight(node.right);
        if(node.right == null && node.left != null) return 1 + leftHeight;
        else if(node.left == null && node.right != null) return 1 + rightHeight;
        else {  //左右都不为空
            return 1 + Math.min(leftHeight, rightHeight);
        }
  • java代码
class Solution {
    int getHeight(TreeNode node) {
        if(node == null) return 0;
        int leftHeight = getHeight(node.left);
        int rightHeight = getHeight(node.right);
        if(node.right == null && node.left != null) return 1 + leftHeight;
        else if(node.left == null && node.right != null) return 1 + rightHeight;
        else {  //左右都不为空
            return 1 + Math.min(leftHeight, rightHeight);
        }
    }

    public int minDepth(TreeNode root) {
        return getHeight(root);
    }
}

222.完全二叉树的节点个数

普通做法

直接把它当成是一棵普通二叉树,遍历的过程中记录节点数量。递归的话还是用后序(左右中)

  • 时间复杂度:O(n)
  • 空间复杂度:O(log n),算上了递归系统栈占用的空间

完全二叉树做法

完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。

对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。

对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。

在这里插入图片描述

我们能不能利用完全二叉树的特性,不要去遍历所有的节点呢?只遍历一部分节点就能判断?

  • 核心思路:利用完全二叉树特性,因为题目是完全二叉树,直接全部遍历左孩子和右孩子,如果高度相等它就是满二叉树,直接return 2^树深度 - 1个节点。内侧的节点就不用遍历了!

  • 在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。

递归三部曲

终止条件:==null或者为满二叉树的情况

 //终止条件
        if(root == null) return 0;
        TreeNode left = root.left;
        TreeNode right = root.right;
        int leftHeight = 0, rightHeight = 0;  //计数从0开始
        while(left != null) {
            left = left.left;
            leftHeight += 1;
        } 
        while(right != null) {
            right = right.right;
            rightHeight += 1;
        }
        if(leftHeight == rightHeight) return (2 << leftHeight) - 1; 
  • 单层递归逻辑
return countNodes(root.left) + countNodes(root.right) + 1;
  • 完整代码
class Solution {
    public int countNodes(TreeNode root) {
        //终止条件
        if(root == null) return 0;
        TreeNode left = root.left;
        TreeNode right = root.right;
        int leftHeight = 0, rightHeight = 0;  //计数从0开始
        while(left != null) {
            left = left.left;
            leftHeight += 1;
        } 
        while(right != null) {
            right = right.right;
            rightHeight += 1;
        }
        if(leftHeight == rightHeight) return (2 << leftHeight) - 1; 
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}
  • 时间复杂度:O(log n × log n)
  • 空间复杂度:O(log n)

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

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

相关文章

8节点空间壳单元Matlab有限元编程 | 曲壳单元 | 模态分析 | 3D壳单元 | 板壳理论| 【源代码+理论文本】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

linux 升级openssl1.1.1w 亲测记录

下载好openssl源码包,解压到指定目录下 tar -xzvf openssl-1.1.1w.tar.gz -C /usr/localcd openssl-1.1.1w/*预编译、编译、安装*/./config --prefix/usr/local/openssl sharedmake && make install备份配置系统中原有的文件、创建软链接、动态库查找路径配置文件 ld.s…

day-25 无重复字符的最长子串

思路&#xff1a;动态规划的思想&#xff0c;遍历字符串&#xff0c;每遇到一个新的字符&#xff0c;将其存入HashMap中&#xff0c;并给其一个唯一值value(value递增)&#xff0c;当前字符若与HashMap中的字符都不一样&#xff0c;则存入HashMap中&#xff0c;若已经存在&…

剑指offer经典题目整理(七)

一、经典dp——最大子数组之和 1.链接 53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 2.描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 3.思路 这是…

深入BEV感知中的魔鬼细节:综述、评估和秘诀

深入BEV感知中的魔鬼细节&#xff1a;综述、评估和秘诀 论文链接&#xff1a;https://arxiv.org/pdf/2209.05324.pdf 学习感知任务的鸟瞰图&#xff08;BEV&#xff09;中的强大表示法是一种趋势&#xff0c;并引起了工业界和学术界的广泛关注。大多数自动驾驶常规方法是在前…

力扣---子集---回溯(子集型回溯)---递归

递归法思路&#xff1a; 首先考虑为什么能用递归&#xff08;因为存在大问题和小问题之间的关系&#xff0c;大问题&#xff1a;从第 i 个数字到最后一个数字之间找子集&#xff0c;小问题&#xff1a;从第 i1 个数字到最后一个数字之间找子集&#xff09;。其次&#xff0c;用…

力扣hot100题解(python版81-90题)

81、爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶示…

如何正确看待竞争对手

很多人一天到晚的抱怨说实体经济不行啦&#xff0c;互联网经济也不行啦&#xff0c;我跟你说&#xff0c;抱怨没有用&#xff0c;你抱怨&#xff0c;这个时代是这样&#xff0c;不抱怨它也是这样&#xff0c;你抱怨&#xff0c;它也在&#xff0c;你不抱怨它还在。不是实体经济…

基于springboot+vue的毕业论文管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

基于SpringBoot的网上订餐系统

技术&#xff1a;springbootvuemysql 一、系统背景 随着我国经济的飞速发展&#xff0c;人们的生活速度明显加快&#xff0c;在餐厅吃饭排队的情况到处可见&#xff0c;近年来由于新兴IT行业的空前发展&#xff0c;它与传统餐饮行业也进行了新旧的结合&#xff0c;很多餐饮商户…

ensp不同vlan间的互相通信

关于不同vlan之间的通信&#xff0c;本章做了最简洁的案例&#xff0c;表示说明 1. 网段设置 1.1 划分四个不同 的 vlan vlan网段vlan10192.168.10.254 /24vlan20192.168.20.254 /24vlan30192.168.30.254 /24vlan40192.168.40.254 /24 1.2 SW1的配置 #进入视图 sys #更改交…

微调alpaca-lora遇到的一些问题

1、环境简介 环境&#xff1a; 系统&#xff1a;Ubuntu torch&#xff1a;2.2.1 python&#xff1a;3.10 gpu&#xff1a;V100 16g peft&#xff1a;0.9.0 使用PEFT中的lora方式微调llama-2-7b-hf&#xff0c;项目地址&#xff1a;alpaca-lora 2、混合精度训练Tensor相互计算会…

第十九章 TypeScript 装饰器Decorator

Decorator 装饰器是一项实验性特性&#xff0c;在未来的版本中可能会发生改变 它们不仅增加了代码的可读性&#xff0c;清晰地表达了意图&#xff0c;而且提供一种方便的手段&#xff0c;增加或修改类的功能 若要启用实验性的装饰器特性&#xff0c;你必须在命令行或tsconfig…

Springboot+vue的高校教师科研管理系统+数据库+报告+免费远程调试

项目介绍: Javaee项目&#xff0c;springboot vue前后端分离项目 本文设计了一个基于Springbootvue的前后端分离的高校教师科研管理系统&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xf…

THM学习笔记—Bounty Hacker

nmap扫描&#xff0c;扫了一大堆但只有三个端口是开放的 试试ftp是否可以匿名登录 可以匿名登录&#xff0c;把里面的文件下载下来 查看里面的内容&#xff0c;猜lin为用户名&#xff0c;locks.txt为密码列表&#xff0c;使用hydra进行ssh登录。 找到密码了&#xff0c;进行ssh…

【Mybatis整合mysql之Json类型属性适配手把手】

【Mybatis整合mysql之Json类型属性适配&&手把手】 场景 JSON 数据类型是 MySQL 5.7.8 开始支持的。在此之前&#xff0c;只能通过字符类型&#xff08;CHAR&#xff0c;VARCHAR 、TEXT或LONGTEXT &#xff09;来保存 JSON 文档。在开发中发现&#xff0c;Mybatis查询…

AWS监控,AWS 性能监控工具

监控云部署的性能是 IT 环境正常运行的内在条件。AWS 云是一个架构良好的框架&#xff0c;管理员可以使用专用的AWS 性能监控工具增强服务的功能。执行AWS监视是为了跟踪在AWS环境中积极运行的应用程序工作负载和资源。AWS监视器跟踪各种AWS云指标&#xff0c;以帮助提高在其上…

电子证书查询系统如何制作证书?

1、制作空白证书&#xff1a;网上找一张证书背景图&#xff0c;用PPT工具或photoshop等图片处理工具&#xff0c;将证书上固定的文字打上&#xff0c;有公章的话贴上电子公章&#xff0c;不固定的内容留空白。 2、制作电子证书&#xff1a;上传前一步制作好的空白证书&#xf…

LeetCode刷题记录:(13)N皇后(难题不难)

leetcode传送通道 传说中的N皇后&#xff0c;不难&#xff0c;进来了就看完吧 注释序号代表鄙人写代码的顺序和思考逻辑&#xff0c;供参考 class Solution {// 1.定义结果数组List<List<String>> result new ArrayList<>();public List<List<String&…

moviepy简介及使用教程

moviepy简介及基本概念 MoviePy 是一个用于视频编辑的 Python 库&#xff0c;使用户能够处理、编辑和操作视频文件。这个库允许你剪辑视频、添加文本、合并视频剪辑&#xff0c;以及应用各种效果和转换。它建立在 NumPy、imageio 和 Decorator 等库的基础上&#xff0c;使得在…