代码随想录算法 - 二叉树

news/2024/9/19 12:34:02/文章来源:https://www.cnblogs.com/code4log/p/18406058

题目1 226. 翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

img

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

img

输入:root = [2,1,3]
输出:[2,3,1]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目范围在 [0, 100]
  • -100 <= Node.val <= 100

思路

这道题可以用先序,中序,后序或者层序遍历去做,思路都是类似的。

递归调用

注意递归结束条件是root为nullptr,在每个非空结点上进行左右孩子指针的交换就行了。

代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* invertTree(TreeNode* root) {if(root == nullptr) return root;TreeNode* tmp = root->left;root->left = root->right;root->right = tmp;invertTree(root->left);invertTree(root->right);return root;}
};

迭代遍历翻转

使用一个辅助的栈或者队列来存储子结点就可以做了。

代码

class Solution {
public:TreeNode* invertTree(TreeNode* root) {stack<TreeNode*> nodeStack;nodeStack.push(root);while(!nodeStack.empty()){TreeNode* curNode = nodeStack.top();nodeStack.pop();if(curNode == nullptr)continue;nodeStack.push(curNode->left);nodeStack.push(curNode->right);swap(curNode->left, curNode->right);}return root;}
};

题目2 101. 对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

img

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

img

输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目在范围 [1, 1000]
  • -100 <= Node.val <= 100

思路

这道题就是将树拆分为左右两个子树,对子树进行相反方向的遍历比较就行了,可以使用递归法和迭代法,思路是类似的我用的是迭代法。

迭代法

class Solution {
public:bool isSymmetric(TreeNode* root) {if(!root->left && !root->right)return true;stack<TreeNode*> nodeStack1, nodeStack2;nodeStack1.push(root->left);nodeStack2.push(root->right);while(!nodeStack1.empty() && !nodeStack2.empty()){TreeNode* lft = nodeStack1.top(),* rht = nodeStack2.top();nodeStack1.pop();nodeStack2.pop();if(!lft && !rht){continue;}if(!lft || !rht || lft->val != rht->val)return false;
#define PUSH(STACK, NODE, POSITION) \STACK.push(NODE->POSITION);PUSH(nodeStack1, lft, left);PUSH(nodeStack1, lft, right);PUSH(nodeStack2, rht, right);PUSH(nodeStack2, rht, left);
#undef PUSH}return nodeStack1.empty() && nodeStack2.empty();}

题目3 104. 二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

img

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:

输入:root = [1,null,2]
输出:2

提示:

  • 树中节点的数量在 [0, 104] 区间内。
  • -100 <= Node.val <= 100

思路

这道题可以用递归法(前,后序遍历)或者迭代法(层序遍历)来计算出深度,基础题。

递归法

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int Nextdepth(TreeNode* root){if(!root){return 0;}return 1 + max(Nextdepth(root->left), Nextdepth(root->right));}int maxDepth(TreeNode* root) {return Nextdepth(root);}
};

迭代法

class Solution {
public:int maxDepth(TreeNode* root) {if(!root)return 0;queue<TreeNode*> nodeQueue;nodeQueue.push(root);int depth = 0;while(!nodeQueue.empty()){int num = nodeQueue.size();for(int i = 0; i < num; i++){TreeNode* node = nodeQueue.front();nodeQueue.pop();if(node->left)nodeQueue.push(node->left);if(node->right)nodeQueue.push(node->right);}depth++;}return depth;}
};

题目4 111. 二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

示例 1:

img

输入:root = [3,9,20,null,null,15,7]
输出:2

示例 2:

输入:root = [2,null,3,null,4,null,5,null,6]
输出:5

提示:

  • 树中节点数的范围在 [0, 105]
  • -1000 <= Node.val <= 1000

思路

和最大深度类似考察基本功,用递归法遍历每一个结点获取最小深度之后累加得到结果;或者用层序遍历迭代到最浅的无双child节点终止。

递归法

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

迭代法

class Solution {
public:int minDepth(TreeNode* root) {if(!root)return 0;queue<TreeNode*> nodeQueue;nodeQueue.push(root);int result = 0;while(!nodeQueue.empty()){int num = nodeQueue.size();for(int i = 0; i < num; i++){TreeNode* curNode = nodeQueue.front();nodeQueue.pop();//若节点无左右child,则为最浅的节点,返回最小深度if(!curNode->left && !curNode->right){return result + 1;}if(curNode->left)nodeQueue.push(curNode->left);if(curNode->right)nodeQueue.push(curNode->right);}result++;}return result;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PTE-MG诊所靶场 wirteup

一.信息收集 1.端口扫描 使用nmap进行扫描,结果如下 ┌──(kali㉿kali)-[~] └─$ nmap -sV 10.0.0.91 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-09 21:37 EDT Nmap scan report for 10.0.0.91 Host is up (0.027s latency). Not shown: 993 filtered tcp por…

煤矿安全帽佩戴检测系统

煤矿安全帽佩戴检测系统在安全生产中是至关重要的。全天候24h识别监督作业人员是否佩戴安全帽,能提高工人的安全防范意识,降低危险发生的几率。伴随着行业需求的持续细分化,煤矿安全帽佩戴检测系统将快速迭代,应用安全帽或工作服装开展分组管理,融合脸部鉴别系统,对重点区…

明厨亮灶监控系统

明厨亮灶监控系统可以识别厨师帽厨师服的穿戴识别,不戴口罩识别,餐厅厨房抽烟识别,后厨出现老鼠识别报警,发现陌生人进入后厨行为及时警报并将报警信息同步给相关工作人员的手机上,协助餐厅厨房工作员提高标准意识。“人工智能厨房”借助传统监控摄像头、视频传输和显示等…

UE中如何制作后处理设置面板

1)UE中如何制作后处理设置面板2)Magica Clothes 2插件与Burst编译问题3)UI大小和文本变量4)如何检索直线与网格的所有交点这是第399篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。 UWA社区主页:c…

Winform C# 窗体应用程序简单入门

搬运来源:https://blog.csdn.net/weixin_46262993/article/details/104169982?spm=1001.2014.3001.5502 一、什么是Winform? WinForm 是 Windows Form 的简称,是基于 .NET Framework 平台的客户端(PC软件)开发技术,一般使用C#编程。C# WinForm 编程需要创建「Windows窗体…

SAP ABAP 选择屏幕加按钮

示例: SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002. SELECTION-SCREEN:BEGIN OF LINE,PUSHBUTTON 1(15) sel USER-COMMAND sel,PUSHBUTTON 17(15) unsel USER-COMMAND unsel,END OF LINE.SELECTION-SCREEN BEGIN OF LINE. PARAMETERS: c01 TYPE char1 AS CH…

国产游戏蓄力,火山引擎ByteHouse助力游戏厂商造爆款

ByteHouse具备高性能特性,在高并发、点查场景中具备显著优势,并且全面兼容ClickHouse、MySQL生态,可以实现应用平滑迁移,与游戏场景中的用户行为分析、广告效果分析、广告推荐、游戏推荐等非常匹配。更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】…

GIS学习(个人学习笔记)(永久修改属性表字段顺序的方法2——access数据库软件修改字段顺序)

当然更推荐直接在GIS中使用合并工具来调整字段顺序或者删除将shp文件导出为数据库文件 使用TableToDBASE表转 dBASE (批量)3.再用office access导入4.将2中生成的dbf文件打开 5.对需要调整顺序的字段进行编辑或者删除

08 Windows批处理之执行编译后的程序

本文是关于一个bat文件执行或调用另一种语言编写和编译的程序。实际上,这样做的语法非常简单。本文最有趣的方面是,有时正在执行的程序在bat文件中没有定义路径。bat文件如何找到可执行文件? 本文的主要重点将放在查找此类程序的两个非常重要的机制上,即当前目录和路径变量…

工地安全带识别系统

高处工地安全带识别系统选用目前的视频监控系统系统,纪录高清图像。依据图像检测,工地现场作业人员的工地安全带识别系统将识别工作人员是不是系好安全带,如果没有则立刻报警提醒。施工工地安全带识别:安全带识别系统高处作业安全带识别。高处工地安全带识别系统选用目前的…

91卫图内存不能为written

91卫图出现报错,报错信息如下:解决方法: 把91卫图助手软件目录下面的layer.bin改成layer1.bin,然后再打开软件 打开以后,图层管理器, 右键“我的图层”,点击还原所有图层,选择最早的一个时间点还原