每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历

news/2024/12/22 20:05:00/

每日一题系列(day 04)

前言:

🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈

   🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉算法👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!💪💪当然切记不可😈走火入魔😈,每日打怪,日日累积,终能成圣🙏🙏!开启我们今天的斩妖之旅吧!✈️✈️


  因为这两题具有很强的相似性,所以将两题放在一起。

一、LeetCode-107.二叉树的层序遍历 II

题目:

   给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例1:

在这里插入图片描述

示例2:

在这里插入图片描述

注意事项:

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

思路:

  本题和昨天写的题很像,只不过这次的层序遍历是要从叶子结点所在层向上进行层序遍历,既然我们使用二维数组来进行层序遍历,我们不妨先将正常的层序遍历保存到二维数组中,在正常的层序遍历完成之后,将二维数组的元素(一维数组,存的是每一层节点的值)首尾交换。

  我们再来回顾一下昨天说的二叉树层序遍历深搜的过程。
  1、深搜需要传入参数root, 从哪层开始处理的层数,二维数组ans,在dfs中,首先判断当前节点是否为空,如果为空就return;
  2、不过当前节点不为空,接下来就判断当前层数是否是最新遍历到的层数,如果是,在本层数组里压入元素之前需要创建一个空一维数组尾插到二维数组ans中。
   3、接下来就是将当前处理节点压入到对应层数的一维数组中,这个节点处理完毕,深搜就要开始递归处理,先向左子孩子处理,下一层为本层节点+1,所以传参层数为k + 1,同理右子树也是如此,最后返回即可。
 &emsp:4、深搜完成之后,我们就得到了一个自顶向下的层序遍历结果,我们想让结果自底向上遍历,只需ans的一维数组进行首尾交换,最后返回即可。
在这里插入图片描述

代码实现:

/*** 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:void dfs(TreeNode *root, int k, vector<vector<int>> &ans)//深搜方式进行层序遍历{if(root == NULL) return;if(k == ans.size()) ans.push_back(vector<int>());ans[k].push_back(root -> val);dfs(root -> left, k + 1, ans);dfs(root -> right, k + 1, ans);return;}vector<vector<int>> levelOrderBottom(TreeNode* root) {vector<vector<int>> ans;dfs(root, 0, ans);//先将正常的层序遍历拿到for(int i = 0, j = ans.size() - 1; i < j ; i++, j--)//翻转正常的层序遍历,达到想要的效果{swap(ans[i], ans[j]);}return ans;//最后返回数组即可}
};

一、LeetCode-103.二叉树的锯齿形层序遍历

题目:

   给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

示例1:

在这里插入图片描述

示例2:

在这里插入图片描述

思路:

  这题要求我们层序遍历要螺旋遍历,第一层从左到右遍历这一层节点,第二层从右到左遍历这层节点,第三层还是从左到右…遍历呈现出一种螺旋型遍历。
  其实我们和上面107题一样,只需要先用深搜将正常的层序遍历结果拿到,在处理这个层序遍历的结果,拿到了正常层序遍历结果,我们来观察:
在这里插入图片描述
  我们可以发现,我们遍历时需要翻转的总是偶数层,所以我们翻转的时候只需要处理偶数层的一维数组就可以了。

代码实现:

/*** 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:void dfs(TreeNode *root, int k, vector<vector<int>> &ans){if(root == NULL) return;if(k == ans.size()) ans.push_back(vector<int>());ans[k].push_back(root -> val);dfs(root -> left, k + 1, ans);dfs(root -> right, k + 1, ans);return;}vector<vector<int>> zigzagLevelOrder(TreeNode* root) {vector<vector<int>> ans;dfs(root, 0, ans);//深搜for(int k = 1 ; k < ans.size() ; k += 2)//偶数层才翻转{for(int i = 0, j = ans[k].size() - 1 ; i < j ; i++, j--)//将需要翻转的层进行翻转{swap(ans[k][i], ans[k][j]);}}return ans;//返回翻转后的数组即可}
};

  这两题的相似度很高,我这里都是使用深搜的方式得到正常层序遍历的结果,当然你可以使用队列的形式得到层序遍历结果,这里就不展示了,这两题的不用是对层序遍历的结果的处理,转换成另外的形式。


http://www.ppmy.cn/news/1240136.html

相关文章

广州华锐互动:AR可视化展示昆虫让教学过程更直观生动

随着科技的不断发展&#xff0c;AR&#xff08;增强现实&#xff09;技术已经逐渐走进我们的生活。通过AR技术&#xff0c;我们可以将虚拟的信息叠加到现实世界中&#xff0c;让现实世界变得更加丰富多彩。在这篇文章中&#xff0c;我们将以昆虫为主题&#xff0c;探讨AR增强现…

关于SSD的FTL

FTL Flash Translation Layer 闪存转换层 作用&#xff1a;完成主机逻辑地址空间到闪存物理空间的映射 简言之&#xff0c;使用者在C盘下写入一个文件&#xff0c;对应这个文件资料写进SSD,SSD会记录这份资料存储的位置&#xff0c;在HOST再次读取时&#xff0c;从SSD闪存对应位…

Chrome网页前端组件调试模式,获取核心业务逻辑

进入网页&#xff0c;点击F12&#xff0c;弹出开发者工具对话框&#xff0c;如下图 定位目标组件&#xff0c;如按钮&#xff0c;修改html&#xff0c;插入οnclick"debugger"代码 在网页点击该按钮&#xff0c;触发调试模式 不停按F11&#xff0c;逐个检索文件…

5G NSA注册解析及图标显示方案

5G NSA注册解析及图标显示方案 1. NSA注册流程解析1.1 NSA注册流程1.2 NAS消息信元变化1.3 UE能力信元变化1.3.1 第一次UE能力查询1.3.2 后续UE能力查询1.3.3 UE能力过滤器解析 1.4 UE测量配置1.5 SCG添加消息解析1.6 SCG添加成功1.7 Split Bearer承载的建立1.8 NR协议查询索引…

WordPress老是提示无法连接到FTP服务器

在 WordPress 目录下找到 wp-config.php 文件并编辑&#xff0c;在最后一行加上 define(FS_METHOD, "direct");

Error querying database. Cause: java.lang.reflect.InaccessibleObjectException:

最近开发过程中&#xff0c;居然碰到了一个Arrays.asList的错&#xff0c;怎么个场景呢&#xff1f;传参一个用固定符号拼接的字符串&#xff0c;需要转成集合然后再myBatis里in判断。然后就报错了。 一、代码层面 service层面&#xff1a; shortDetailUrlList Arrays.asLi…

SpringMVC(二)

八、HttpMessageConverter HttpMessageConverter&#xff0c;报文信息转换器&#xff0c;将请求报文转换为Java对象&#xff0c;或将Java对象转换为响应报文 HttpMessageConverter提供了两个注解和两个类型&#xff1a;RequestBody&#xff0c;ResponseBody&#xff0c;Reque…