力扣刷题 二叉树层序遍历相关题目II

NO.116 填充每个节点的下一个右侧节点指针

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

示例 1:

输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。

示例 2:

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

本题难点在于如何填充每个节点的next 指针,让这个指针指向其下一个右侧节点。如何获取队列中下一个节点,我们还没有遍历到下一个节点,怎么能获取下一个节点的指针呢?

这里的思路是保存上一个遍历节点的指针,让它的next指针指向当前节点。是不是很巧妙,和我们自然的思路不太一样。

因为我们用到了前节点的变量,而头节点并没有前节点,所以需要单独考虑情况。

完整代码如下

class Solution {
public:Node* connect(Node* root) {queue<Node*> que;if(root != NULL){que.push(root);}while(!que.empty()){// 如何判断每一层的个数//记录队列的大小int size = que.size();//建立当前节点Node* node;Node* prenode;// 遍历队列,放入数组for(int i = 0; i < size; i++ ){//如果遍历到这一层的头节点if(i == 0){node = que.front();prenode = node;}else{//出队列第一个元素放入数组node = que.front();//上一个节点的next指针指向当前节点prenode->next = node;//将前节点更新为当前节点prenode = node;}//将左右节点入队列if(node->left) que.push(node->left);if(node->right) que.push(node->right);//将当前节点弹出que.pop();}//这一层遍历完,将最后一个元素的next设置为nullnode->next = NULL;}return root;}
};

总结与反思

层序遍历最关键的是深刻理解整个for循环是每一层遍历的核心,这样添加代码就会更加自如,知道是在层前还是层中还是层后。

写完代码,可以验证一遍测试用例,发现bug,避免显而易见的错误。

NO.117 填充每个节点的下一个右侧节点指针II

给定一个二叉树:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。

初始状态下,所有 next 指针都被设置为 NULL 。

示例 1:

输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。

示例 2:

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

这道题目说是二叉树,但116题目说是完整二叉树,其实没有任何差别,一样的代码一样的逻辑一样的味道

 完整代码如下

class Solution {
public:Node* connect(Node* root) {queue<Node*> que;if(root != NULL){que.push(root);}while(!que.empty()){// 如何判断每一层的个数//记录队列的大小int size = que.size();//建立当前节点Node* node;Node* prenode;// 遍历队列,放入数组for(int i = 0; i < size; i++ ){//如果遍历到这一层的头节点if(i == 0){node = que.front();prenode = node;}else{//出队列第一个元素放入数组node = que.front();//上一个节点的next指针指向当前节点prenode->next = node;//将前节点更新为当前节点prenode = node;}//将左右节点入队列if(node->left) que.push(node->left);if(node->right) que.push(node->right);//将当前节点弹出que.pop();}//这一层遍历完,将最后一个元素的next设置为nullnode->next = NULL;}return root;}
};

NO.104 二叉树的最大深度

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

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

示例 1:

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

示例 2:

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

完整代码如下

class Solution {
public:int maxDepth(TreeNode* root) {queue<TreeNode*> que;//记录最大深度int depth = 0;if(root != NULL){que.push(root);}while(!que.empty()){// 如何判断每一层的个数//记录队列的大小int size = que.size();// 遍历队列,放入数组for(int i = 0; i < size; i++ ){TreeNode* node = que.front();//将左右节点入队列if(node->left) que.push(node->left);if(node->right) que.push(node->right);//将当前节点弹出que.pop();} depth++;}//循环结束说明遍历完最后一层,返回深度return depth;}
};

NO.111 二叉树的最小深度

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

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

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

示例 1:

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

示例 2:

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

完整代码如下

class Solution {
public:int minDepth(TreeNode* root) {queue<TreeNode*> que;//记录深度int depth = 0;if(root != NULL){que.push(root);}while(!que.empty()){// 如何判断每一层的个数//记录队列的大小int size = que.size();// 遍历队列,放入数组depth++;for(int i = 0; i < size; i++ ){TreeNode* node = que.front();//一旦找到叶子节点就返回深度if(node->left == NULL && node->right == NULL) return depth;//将左右节点入队列if(node->left) que.push(node->left);if(node->right) que.push(node->right);//将当前节点弹出que.pop();} }return 0;}
};

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

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

相关文章

mysql8.0高可用集群架构实战

MySQL :: MySQL Shell 8.0 :: 7 MySQL InnoDB Cluster 基本概述 InnoDB Cluster是MySQL官方实现高可用读写分离的架构方案,其中包含以下组件 MySQL Group Replication,简称MGR,是MySQL的主从同步高可用方案,包括数据同步及角色选举Mysql Shell 是InnoDB Cluster的管理工具,用…

C++---vector容器

是STL容器中的一种常用的容器&#xff0c;由于其大小(size)可变&#xff0c;常用于数组大小不可知的情况下来替代数组。vector容器与数组十分相似&#xff0c;被称为动态数组。时间复杂度为O&#xff08;1&#xff09;。 数组数据通常存储在栈中&#xff0c;vector数据通常存储…

2024.4.13 Python 爬虫复习day01

目录 day01_HTTP协议HTML页面web服务器 各类名词解释 URL统一资源定位符 HTTP协议 HTML页面 知识点: 第一个页面 标题标签和图片标签 注册页面 登录页面 WEB服务器 安装fastapi和uvicorn 原始命令方式 镜像源命令方式 工具方式 快速搭建web服务器 知识点: 示例…

天地人和•大道不孤——卢禹舜中国画作品展在重庆美术馆隆重开幕

2024年4月12日&#xff0c;由中国国家画院、重庆市文化和旅游发展委员会主办&#xff0c;重庆美术馆&#xff08;重庆画院、重庆国画院&#xff09;、北京八荒锦绣美术馆、中国国际文化交流基金会卢禹舜艺术基金承办的“天地人和•大道不孤——卢禹舜中国画作品展”开幕式在重庆…

MATLAB 构建协方差矩阵,解算特征值和特征向量(63)

MATLAB 局部点云构建协方差矩阵,解算特征值和特征向量(63) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 对于某片有待分析的点云,我们希望构建协方差矩阵,计算特征值和特征向量,这是很多算法必要的分析方法,这里提供完整的计算代码(验证正确) !!! 特别需要注意…

JavaEE初阶Day 7:多线程(5)

目录 Day 7&#xff1a;多线程&#xff08;5&#xff09;1. 死锁2. 死锁场景3. 场景二&#xff1a;两个线程&#xff0c;两把锁4. 场景三&#xff1a;N个线程&#xff0c;M把锁5. 避免死锁问题6. 内存可见性问题 Day 7&#xff1a;多线程&#xff08;5&#xff09; 回顾synchr…

银行账户 码题集

输入案例&#xff1a; 5 5 2 2 2 2 2 1 2 1.5 2 1 1.5 1 2 1.5 2 1 1.5 1 2 1.5输出&#xff1a;2.00 题目关键&#xff1a; 仔细读题目要求&#xff0c;转出账户被盗取z&#xff0c;转入账户转入z的整数部分&#xff0c;盗取者赚Z的小数部分的蝇头小利。且先转账&#xff0c;…

操作系统(第四周 第二堂)

目录 回顾 进程运行 进程的创建 进程的工作 举例 进程的删除 举例1&#xff08;走到return 0结束&#xff09; 举例2&#xff08;利用exit&#xff08;1&#xff09;结束&#xff09; 进程通信 共享内存 生产者算法 消费者算法 消息传递 定义 算法实现 总结 回顾…

BD202311夏日漫步(最少步数,BFS或者 Dijstra)

本题链接&#xff1a;码蹄集 题目&#xff1a; 夏日夜晚&#xff0c;小度看着庭院中长长的走廊&#xff0c;萌发出想要在上面散步的欲望&#xff0c;小度注意到月光透过树荫落在地砖上&#xff0c;并且由于树荫的遮蔽度不通&#xff0c;所以月光的亮度不同&#xff0c;为了直…

【蓝桥杯】第十五届填空题a.握手问题

题解&#xff1a; 根据问题描述&#xff0c;总共有 50 人参加会议&#xff0c;每个人除了与自己以外的其他所有人握手一次。但有 7 个人彼此之间没有进行握手&#xff0c;而与其他所有人都进行了握手。 首先&#xff0c;计算所有人进行握手的总次数&#xff1a; 总人数为 50 …

每日OJ题_01背包③_力扣494. 目标和(dp+滚动数组优化)

目录 力扣494. 目标和 问题解析 解析代码 滚动数组优化代码 力扣494. 目标和 494. 目标和 难度 中等 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; …

AI论文速读 |(图腾) TOTEM:通用时间序列分析的token化时间序列嵌入表示

题目&#xff1a;TOTEM: TOkenized Time Series EMbeddings for General Time Series Analysis 作者&#xff1a;Sabera Talukder ; Yisong Yue ; Georgia Gkioxari 机构&#xff1a;加州理工学院&#xff08;Caltech&#xff09; 网址&#xff1a;https://arxiv.org/abs/24…