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

每日一题系列(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.hqwc.cn/news/217301.html

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

相关文章

Java 设计模式——建造者模式

目录 1.概述2.结构3.实例3.1.产品类3.2.抽象建造者类3.3.具体建造者类3.4.指挥者类3.5.测试 4.优缺点5.使用场景6.模式扩展7.创建者模式对比 1.概述 建造者模式 (Builder Pattern) 是一种创建型设计模式&#xff0c;用于创建复杂对象。它将对象的构建过程分离成独立的部分&…

浅谈如何成为一名优秀教师

你是不是也有一个梦想&#xff0c;想要成为一位优秀的教师&#xff0c;让孩子们如沐春风&#xff0c;收获满满&#xff1f;那么&#xff0c;今天就让我来给你分享一下成为优秀教师的秘诀吧&#xff01; 热爱教育&#xff0c;点燃激情 成为优秀教师&#xff0c;首先要有对教育的…

install pnpm : 无法加载文件的解决办法

问题描述 我在使用pnpm的时候报错 PS D:\emss\pure-admin-backend> pnpm install pnpm : 无法加载文件 C:\Users\RD-16\AppData\Roaming\npm\pnpm.ps1。未对文件 C:\Users\RD-16\AppData\Roaming\npm\pnpm.ps1 进行数字签名。无法在当前系统上运 行该脚本。有关运行脚本和设…

揭秘:如何精准定位性能瓶颈,优化系统性能?

你好&#xff0c;我是小濠&#xff0c;目前在一家准一线互联网大厂做测试开发工程师。对于一般公司普通测试工程师来说&#xff0c;可能性能测试做的并不是很复杂&#xff0c;可能只是编写下脚本&#xff0c;做个压测&#xff0c;然后输出报告结果&#xff0c;瓶颈分析和调优的…

软件测试 | MySQL 主键约束详解:保障数据完整性与性能优化

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

Python武器库开发-前端篇之CSS基本语法(三十)

前端篇之CSS基本语法(三十) CSS简介 CSS&#xff08;层叠样式表&#xff09;是一种用于描述网页外观和布局的样式表语言。它与 HTML 一起&#xff0c;帮助开发者对网页进行美化和布局。CSS通过定义网页元素的颜色、字体、大小、背景、边框等属性&#xff0c;使网页变得更加美…

scipy 笔记:scipy.spatial.distance

1 pdist 计算n维空间中观测点之间的成对距离。 scipy.spatial.distance.pdist(X, metriceuclidean, *, outNone, **kwargs) 1.1 主要参数 X一个m行n列的数组&#xff0c;表示n维空间中的m个原始观测点metric使用的距离度量out输出数组。如果非空&#xff0c;压缩的距离矩阵…

基于springboot实现学生成绩管理系统项目【项目源码+论文说明】

基于springboot实现学生成绩管理系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&am…

IDEA中JDK21控制台打印的中文乱码

IDEA中&#xff0c;使用的JDK21&#xff0c;控制台打印中文乱码&#xff0c;解决办法是重装了一下JDK。 我之前安装的版本是“jdk-21_windows-x64_bin.exe”&#xff0c;我配置了多个JDK环境&#xff0c;所以使用的是安装文件进行安装的。这次解决乱码问题&#xff0c;我重新安…

禁止指定电脑程序运行的2种方法

你可能要问了&#xff0c;为什么要禁止电脑程序运行呢&#xff0c;因为有的公司要净化公司的工作环境&#xff0c;防止某些刺头员工在公司电脑上瞎搞。也有部分家长&#xff0c;是为了防止自己家的孩子利用电脑乱下载东西。 今天就分享2种禁止指定电脑程序运行的方法&#xff1…

微信小程序-跳转到另一个小程序

微信小程序-跳转到另一个小程序 微信小程序跳转到另一个小程序有一个条件:这两个小程序被同一个微信公众号关联&#xff0c;否则不能跳转&#xff0c;会报错。 官方文档 wx.navigateToMiniProgram({appId: wxa38r249405b957c6,path: pages/splash/index,//extraData: 需要传递…

电子学会C/C++编程等级考试2022年03月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:温度统计 现有一段时间的温度数据,请统计指定温度出现的次数。 时间限制:1000 内存限制:65536输入 第一行一个整数n,表示温度数据的个数。(0 < n ≤ 200) 第二行n个整数,以空格分隔,每个整数表示一个温度,温度的范围大…