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

算法Day16 | 104.二叉树的最大深度,559.n叉树的最大深度, 111.二叉树的最小深度,222.完全二叉树的节点个数

Day16

    • 104.二叉树的最大深度
    • 559.n叉树的最大深度
    • 111.二叉树的最小深度
    • 222.完全二叉树的节点个数

104.二叉树的最大深度

题目链接: 104.二叉树的最大深度
深度和高度相反。
高度,自然是从下向上数:叶子节点是第一层,往上数,越来越多。用后序遍历来求高度。(自己排一遍后序遍历,注意中间节点的位置,最后再处理根节点)
深度,自然是从上向下数:根节点是第一层,往下数,越来越多。用前序遍历来求深度。

递归:用后序遍历求高度(本题高度相当于深度)

class Solution {
public:int recursion(TreeNode* cur) {if (!cur) return 0;int left = recursion(cur->left);//左 int right = recursion(cur->right);//右//处理成高度,子节点数值 + 1return 1 + max(left, right);//中}int maxDepth(TreeNode* root) {return recursion(root);}
};

递归:用前序遍历求深度

class Solution {
public://每个递归函数中,都有一个resultint result = 0;//递归中用到result,也可以写到函数参数中void recursion(TreeNode* cur, int depth) {result = result > depth ? result : depth;//中。取最大值if (!cur->left && !cur->right) return;if (cur->left) recursion(cur->left, depth + 1);//左if (cur->right) recursion(cur->right, depth + 1);//右}int maxDepth(TreeNode* root) {if (!root) return 0;recursion(root, 1);return result;}
};

迭代法 层序遍历

class Solution {
public:int maxDepth(TreeNode* root) {queue<TreeNode*> que;if (root) que.push(root);int res = 0;while (!que.empty()) {int size = que.size();while (size--) {TreeNode* cur = que.front();que.pop();if (cur->left) que.push(cur->left);if (cur->right) que.push(cur->right);}++res;}return res;}
};

559.n叉树的最大深度

题目链接:559.n叉树的最大深度
递归 后序遍历。

class Solution {
public:int maxDepth(Node* root) {if (!root) return 0;int depth = 0;for (auto& i: root->children) {depth = max(depth, maxDepth(i));//子节点中最高}return depth + 1;}
};

层序迭代

class Solution {
public:int maxDepth(Node* root) {queue<Node*> que;if(!root) return 0;else que.push(root);int depth = 0;while (!que.empty()) {int size = que.size();while (size--) {Node* cur = que.front();que.pop();for (auto& i : cur->children) {que.push(i);}}++depth;}return depth;}
};

111.二叉树的最小深度

题目链接: 111.二叉树的最小深度
递归 后序遍历

class Solution {
public:int minDepth(TreeNode* root) {if (!root) return 0;int left = minDepth(root->left);//左int right = minDepth(root->right);//右//中if (!root->left && root->right)return 1 + right;if (root->left && !root->right)return 1 + left;return 1 + min(left, right);}
};

递归前序遍历

class Solution {
public:int res = INT_MAX;void recursion(TreeNode* cur, int depth) {if (!cur) return;//中if (!cur->left && !cur->right) {res = min(res, depth);}if (cur->left) recursion(cur->left, depth + 1);//左if (cur->right) recursion(cur->right, depth + 1);//右return;}int minDepth(TreeNode* root) {if (!root) return 0;recursion(root, 1);return res;}
};

迭代 层序遍历

class Solution {
public:int minDepth(TreeNode* root) {queue<TreeNode*> que;if (!root) return 0;if (root) que.push(root);int res = 1;//至少有一层while (!que.empty()) {int size = que.size();while (size--) {TreeNode* cur = que.front();que.pop();if (cur->left) que.push(cur->left);if (cur->right) que.push(cur->right);if (!cur->left && !cur->right) return res;}++res;}return res;}
};

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

题目链接:222.完全二叉树的节点个数
通过完全二叉树的性质,判断子树是否为满二叉树,通过 2 k − 1 2^k-1 2k1来加速计算节点个数。
递归 后序遍历

class Solution {
public:int countNodes(TreeNode* root) {if (!root) return 0;//判断是否为满二叉树TreeNode* l = root->left, * r = root->right;int leftCnt = 0, rightCnt = 0;while (l) {l = l->left;++leftCnt;}while (r) {r = r->right;++rightCnt;}if (leftCnt == rightCnt) return (2 << leftCnt) - 1;//注意<<的优先级小于-的优先级int leftSum = countNodes(root->left);//左int rightSum = countNodes(root->right);//右return leftSum + rightSum + 1/*cur节点*/;//中}
};

迭代层序遍历

class Solution {
public:int countNodes(TreeNode* root) {queue<TreeNode*> que;if (!root) return 0;else que.push(root);int cnt = 0;while (!que.empty()) {int size = que.size();while (size--) {TreeNode* cur = que.front();que.pop();++cnt;if (cur->left) que.push(cur->left);if (cur->right) que.push(cur->right);}}return cnt;}
};

相关文章:

算法Day16 | 104.二叉树的最大深度,559.n叉树的最大深度, 111.二叉树的最小深度,222.完全二叉树的节点个数

Day16 104.二叉树的最大深度559.n叉树的最大深度111.二叉树的最小深度222.完全二叉树的节点个数 104.二叉树的最大深度 题目链接&#xff1a; 104.二叉树的最大深度 深度和高度相反。 高度&#xff0c;自然是从下向上数&#xff1a;叶子节点是第一层&#xff0c;往上数&#x…...

java设计模式之责任链设计模式的前世今生

责任链设计模式是什么&#xff1f; 责任链设计模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许多个对象都有机会处理请求&#xff0c;从而避免请求的发送者与接收者之间的耦合关系。在责任链模式中&#xff0c;每个处理对…...

是面试官放水,还是公司太缺人了?华为原来这么容易就进了...

华为是大企业&#xff0c;是不是很难进去啊&#xff1f;” “在华为做软件测试&#xff0c;能得到很好的发展吗&#xff1f; 一进去就有9.5K&#xff0c;其实也没有想的那么难” 直到现在&#xff0c;心情都还是无比激动&#xff01; 本人211非科班&#xff0c;之前在字节和腾…...

PLC/DCS系统常见的干扰现象及判断方法

一般来说&#xff0c;常见的干扰现象有以下几种&#xff1a; 1.系统发指令时&#xff0c;电机无规则地转动&#xff1b; 2.信号等于零时&#xff0c;数字显示表数值乱跳; 3。传感器工作时&#xff0c;DCS/PLC 采集过来的信号与实际参数所对应的信号值不吻合&#xff0c;且误…...

c++ 11标准模板(STL) std::map(四)

定义于头文件<map> template< class Key, class T, class Compare std::less<Key>, class Allocator std::allocator<std::pair<const Key, T> > > class map;(1)namespace pmr { template <class Key, class T, clas…...

6.开源非对称加密算法SM2实现

6.开源非对称加密算法SM2实现 前期内容导读&#xff1a; 开源加解密RSA/AES/SHA1/PGP/SM2/SM3/SM4介绍开源AES/SM4/3DES对称加密算法介绍及其实现开源AES/SM4/3DES对称加密算法的验证实现开源非对称加密算法RSA/SM2实现及其应用开源非对称加密算法RSA实现 1. 开源组件 非对称秘…...

Toolformer and Tool Learning(LLMs如何使用工具)

大模型的能力让学术和工业界都对通用人工智能的未来充满幻想&#xff0c;在前一篇博文中已经粗略介绍&#xff0c; Augmented Language Models&#xff08;增强语言模型&#xff09; ALM的两大思路是推理和工具&#xff0c;本篇博文整理两篇关于Toolformer或Tool Learning的论…...

029:Mapbox GL绘制铁路黑白交替的线段

第029个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载数据显示铁路标识的那种黑白交替的线段。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共94行)相关API参考:专栏目标示例效果 配置方式 1)…...

结对编程 --- 大部分程序员喜欢的编程方式

一、介绍 结对编程起源时间可以追溯到 1990 年代早期。这种编程方法最初由 Jim Highsmith 和 Alistair Cockburn 等人提出。后来&#xff0c;Kent Beck 和 Ward Cunningham 等人将其发展成为一种敏捷开发方法&#xff0c;被称为“极限编程”&#xff08;Extreme Programming&am…...

kubernetes-informer机制

一、概念 informer 是 client-go 中的核心工具包&#xff0c;在kubernetes中&#xff0c;各个组件通过HTTP协议跟 API Server 进行通信。如果各组件每次都直接和API Server 进行交互&#xff0c;会给API Server 和ETCD造成非常大的压力。在不依赖任何中间件的情况下&#xff0…...

LeetCode 2451. Odd String Difference【字符串,哈希表】简单

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

切片工具tippecanoe的全网最详细的解释

1.下载和安装 tippecanoe工具是mapbox官方提供的一个服务端切片工具,因此它是运行在服务器上的,它比较友好的支持mac和linux机器。对于windows来讲,就比较麻烦了。 首先对于mac系统,你只需配置好自己的homebrew,保证homebrew能够正常下载东西。 然后只需要一个命令: …...

Linux系统初始化命令的备忘单,Linux运维工程师收藏!

在管理和维护Linux系统时&#xff0c;有一些常用的命令可以帮助您进行系统初始化和配置。这些命令涵盖了各种任务&#xff0c;包括系统设置、用户管理、软件安装和网络配置等。 本文将为您提供一个Linux系统初始化命令的备忘单&#xff0c;以便在需要时方便查阅和使用。 系统设…...

五月最近一次面试,被阿里P8测开虐惨了...

都说金三银四涨薪季&#xff0c;我是着急忙慌的准备简历——5年软件测试经验&#xff0c;可独立测试大型产品项目&#xff0c;熟悉项目测试流程...薪资要求&#xff1f;5年测试经验起码能要个20K吧 我加班肝了一页半简历&#xff0c;投出去一周&#xff0c;面试电话倒是不少&a…...

工业机器视觉缺陷检测工作小结

工业机器视觉检测工作小结 &#xff08;因为网上没有很系统的讲义和文档&#xff0c;都是零零散散的&#xff0c;因此&#xff0c;我自己尝试着总结一下、仅供参考&#xff09; 你想知道的大概率在这都可以找到、相机的了解镜头的了解光源的了解传统算法DL深度学习方法 &#…...

技术笔记:默默耕耘,赢得铁粉的秘密策略!

目录 第一步&#xff1a;真实实践&#xff0c;价值分享第二步&#xff1a;高质量文章的撰写第三步&#xff1a;积极互动&#xff0c;回复评论和留言第四步&#xff1a;定期更新和持续学习第五步&#xff1a;参与技术社区第六步&#xff1a;社区问答和问题解答总结 导语&#xf…...

回收站中怎么找回误删除的文件?这几种方法很实用

当我们在电脑上操作文件的时候&#xff0c;难免会有不小心删除文件的情况发生。这个时候&#xff0c;我们可以打开回收站来找回误删除的文件。但是&#xff0c;有时候我们也会误将回收站清空。那么&#xff0c;该怎样才能找回已经误删除的文件呢&#xff1f;在这里提供了回收站…...

Gateway网关参数进行验签POST 包含requestbody 请求体封装

Gateway网关自定义拦截器的不可重复读取数据 特别注意一点, 因为在网关层 拿出 request 流之后,必须重写getbody()方法把所有的参数放进去,否则后面转发的请求无法接收到任何数据, 坑,巨坑,因为版本问题网上很多都不能兼容, 我的springboot环境 依赖包 <parent><gr…...

【Netty】字节缓冲区 ByteBuf (六)(上)

文章目录 前言一、ByteBuf类二、ByteBuffer 实现原理2.1 ByteBuffer 写入模式2.2 ByteBuffer 读取模式2.3 ByteBuffer 写入模式切换为读取模式2.4 clear() 与 compact() 方法2.5 ByteBuffer 使用案例 总结 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&…...

Python - 面向对象编程 - 实例方法、静态方法、类方法

实例方法 在类中定义的方法默认都是实例方法&#xff0c;前面几篇文章已经大量使用到实例方法 实例方法栗子 class PoloBlog:def __init__(self, name, age):print("自动调用构造方法")self.name nameself.age agedef test(self):print("一个实例方法&…...

从AUC稳健下界到量子场论:机器学习与物理的数学统一

1. 项目概述&#xff1a;当机器学习遇见量子场论如果你在机器学习领域待过一段时间&#xff0c;对AUC&#xff08;Area Under the ROC Curve&#xff09;这个指标一定不陌生。它是衡量二分类模型性能的黄金标准&#xff0c;一个完美的分类器AUC为1&#xff0c;随机猜测则为0.5。…...

WarcraftHelper魔兽争霸3兼容性解决方案:让经典游戏在现代电脑上重获新生

WarcraftHelper魔兽争霸3兼容性解决方案&#xff1a;让经典游戏在现代电脑上重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为心爱的魔兽…...

Thorium浏览器:基于Chromium的终极性能优化与隐私保护深度解析

Thorium浏览器&#xff1a;基于Chromium的终极性能优化与隐私保护深度解析 【免费下载链接】thorium Chromium fork named after radioactive element No. 90. Source code and Linux releases. Windows/MacOS/ARM builds served in different repos, links are towards the to…...

RePKG架构深度解析:解密Wallpaper Engine资源处理的核心技术

RePKG架构深度解析&#xff1a;解密Wallpaper Engine资源处理的核心技术 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 在数字内容创作领域&#xff0c;资源打包与纹理处理是图形应…...

Kerr相干态:从非线性量子光学到光子晶格模拟的实现路径

1. 引言&#xff1a;从经典光场到非线性量子相干态 在量子光学的研究中&#xff0c;相干态是一个基石性的概念。它最初由罗伊格劳伯在1960年代引入&#xff0c;用以描述激光器输出的光场。简单来说&#xff0c;一个理想的单模激光&#xff0c;其量子态就可以用一个相干态来极好…...

量子机器学习安全威胁:NISQ时代的数据投毒攻击与防御挑战

1. 量子机器学习与NISQ时代的安全隐忧量子机器学习&#xff08;QML&#xff09;正站在一个激动人心的十字路口。它承诺将量子计算的指数级并行能力与经典机器学习的模式识别潜力相结合&#xff0c;为解决药物发现、材料科学和金融建模中的复杂问题开辟新路径。其核心在于&#…...

基于流形学习的无人机起降场风场实时估计方法

1. 项目概述与核心挑战在无人机&#xff08;UAV&#xff09;起降场&#xff0c;特别是城市楼顶的垂直起降场&#xff08;Vertiport&#xff09;&#xff0c;风场环境极其复杂。建筑物干扰会产生分离、再附、涡旋等非定常流动结构&#xff0c;对无人机的姿态稳定、轨迹控制和着陆…...

基于FeFET的动态可重构FPGA:实现亚纳秒级上下文切换的硬件加速新架构

1. 项目概述与核心挑战如果你在硬件加速领域摸爬滚打过几年&#xff0c;大概率会对FPGA又爱又恨。爱的是它无与伦比的灵活性&#xff0c;恨的是它在“灵活”和“高效”之间那道难以逾越的鸿沟。传统基于SRAM的FPGA&#xff0c;其可重构性是通过烧写配置位流到SRAM单元来实现的。…...

Arm Development Studio许可协议核心条款与合规指南

1. Arm Development Studio 终端用户许可协议解析作为一名长期从事嵌入式开发的工程师&#xff0c;我深知开发工具许可协议的重要性。Arm Development Studio 作为业界领先的嵌入式开发套件&#xff0c;其 EULA&#xff08;终端用户许可协议&#xff09;直接影响着我们的日常开…...

【Python趣味编程】用 Tkinter 打造“爱心便签墙”:一份来自代码的温柔

【Python趣味编程】用 Tkinter 打造“爱心便签墙”&#xff1a;一份来自代码的温柔 文章目录【Python趣味编程】用 Tkinter 打造“爱心便签墙”&#xff1a;一份来自代码的温柔&#x1f3af; 前言&#x1f9e0; 核心思路关键点&#xff1a;&#x1f4bb; 完整代码&#x1f527;…...