算法学习——LeetCode力扣二叉树篇1

算法学习——LeetCode力扣二叉树篇1

在这里插入图片描述

144. 二叉树的前序遍历

144. 二叉树的前序遍历 - 力扣(LeetCode)

描述

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

提示

  • 树中节点数目在范围 [0, 100] 内
  • -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:void Traversal(TreeNode* cur , vector<int> &result){if (cur == nullptr) return;result.push_back(cur->val);Traversal(cur->left , result);Traversal(cur->right , result);}vector<int> preorderTraversal(TreeNode* root) {vector<int> result;Traversal(root,result);return result;}
};
非递归遍历
/*** 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:vector<int> preorderTraversal(TreeNode* root) {vector<int> result;stack<TreeNode*> my_stack; if(root == nullptr) return result;my_stack.push(root);//前序遍历是中左右,先处理一个中就是rootwhile(my_stack.empty() != 1){TreeNode* my_node = my_stack.top();//提前中节点my_stack.pop();//中节点压入结果result.push_back(my_node->val);//之后将中节点的左右子节点放到栈里,作为未来的中节点//压入栈的顺序和弹出栈是相反的,先遍历左再是右,所有先压入右再压入左if(my_node->right != nullptr) my_stack.push(my_node->right);if(my_node->left  != nullptr) my_stack.push(my_node->left);}return result;}
};

145. 二叉树的后序遍历

145. 二叉树的后序遍历 - 力扣(LeetCode)

描述

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。

示例

示例 1:

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

示例 2:

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

示例 3:

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

提示

  • 树中节点的数目在范围 [0, 100] 内
  • -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:void traversal(TreeNode* cur , vector<int> &result){if (cur == nullptr) return;traversal(cur->left , result);traversal(cur->right , result);result.push_back(cur->val);}vector<int> postorderTraversal(TreeNode* root) {vector<int> result;traversal(root, result);return result;}
};
非递归遍历
/*** 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:vector<int> postorderTraversal(TreeNode* root) {vector<int> result;stack<TreeNode*> my_stack;if(root == nullptr) return result;my_stack.push(root);while(my_stack.empty() != 1){TreeNode* my_node = my_stack.top();my_stack.pop();//和前序一样,但是变成中右左result.push_back(my_node->val);if(my_node->left != nullptr) my_stack.push(my_node->left);if(my_node->right != nullptr) my_stack.push(my_node->right);  }//反转,变成左右中reverse (result.begin() , result.end());return result;}
};

94. 二叉树的中序遍历

94. 二叉树的中序遍历 - 力扣(LeetCode)

描述

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例

示例 1:

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

示例 2:

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

示例 3:

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

提示

  • 树中节点数目在范围 [0, 100] 内
  • -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:void traversal(TreeNode* cur , vector<int> &result){if(cur==nullptr) return;traversal( cur->left , result);result.push_back( cur->val);traversal( cur->right , result);}vector<int> inorderTraversal(TreeNode* root) {vector<int> result;traversal(root,result);return result;}
};
非递归遍历
/*** 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:vector<int> inorderTraversal(TreeNode* root) {vector<int> result;stack<TreeNode*> my_stack;if(root == nullptr) return result;TreeNode* cur = root;while(cur != nullptr || my_stack.empty() != 1){if(cur != nullptr)//找到cur的最左叶子节点{my_stack.push(cur);//找的过程中所有的左节点都存起来cur = cur->left;}else//处理中节点和右节点{cur = my_stack.top();//输出栈里之前存的左节点 ,这时左节点看作成中间节点my_stack.pop();result.push_back(cur->val);cur = cur->right;//然后找刚才输出左节点作为中间点时的右节点}}       return result;}
};

102. 二叉树的层序遍历

102. 二叉树的层序遍历 - 力扣(LeetCode)

描述

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例

示例 1:

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

输入:root = [1]
输出:[[1]]
示例 3:

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

提示

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

代码解析

/*** 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:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> result;TreeNode* node ; //迭代节点queue<TreeNode*> my_que; //队列if(root == nullptr) return result;else // 根节点进队列{my_que.push(root);}while(my_que.empty() != 1){int size = my_que.size(); //size是不断变化的,指每一层级的点数量vector<int> nums;//每一层级存放的点  //将每一层的点从队列弹出放入nums,并且下一个层级点放入队列for(int i=0 ; i<size ; i++) {node = my_que.front(); //该层级的点弹出放入数组my_que.pop();nums.push_back(node->val);//每一个弹出点的下一个层级左右节点压入队列if(node->left != nullptr)    my_que.push(node->left);if(node->right != nullptr)   my_que.push(node->right);}result.push_back(nums);}return result;}
};

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

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

相关文章

3D裸眼技术行业研究:2026年市场投资规模为10.78亿元

3D裸眼技术大多处于研发阶段&#xff0c;它的研发分两个方向&#xff0c;一是硬件设备的研发&#xff0c;二为显示内容的处理研发。第二种已经开始小范围的商业运用。大众消费者接触的不多。从技术上来看&#xff0c;3D裸眼可分为光屏障式(Barrier)、柱状透镜(Lenticular Lens)…

【第六天】c++虚函数多态

一、多态的概述 多态按字面的意思就是多种形态。当类之间存在层次结构&#xff0c;并且类之间是通过继承关联&#xff08;父类与子类&#xff09;时&#xff0c;就会用到多态。 C 多态意味着调用成员函数时&#xff0c;会根据调用函数的对象的类型来执行不同的函数。 静态多态&…

七、热身仪式(Warm-Up Rituals)

5.Warm Up Rituals 五、热身仪式 A warm up ritual is your per flight checklist you go through before you start focusing for a big session.It may be checking that you have water, that you don’t need to use the bathroom, that your phone is turned off or you’…

区间dp 笔记

区间dp一般是先枚举区间长度&#xff0c;再枚举左端点&#xff0c;再枚举分界点&#xff0c;时间复杂度为 环形石子合并 将 n 堆石子绕圆形操场排放&#xff0c;现要将石子有序地合并成一堆。 规定每次只能选相邻的两堆合并成新的一堆&#xff0c;并将新的一堆的石子数记做该…

C#实现矩阵乘法

目录 一、使用的方法 1.矩阵 2.矩阵的乘法原理 二、实例 1.源码 2.生成效果 一、使用的方法 矩阵相当于一个数组&#xff0c;主要用来存储一系列数&#xff0c;例如&#xff0c;mn矩阵是排列在m行和n列中的一系列数&#xff0c;mn矩阵可与一个np矩阵相乘&#xff0c;结果…

地铁智能运维要接哪些数据?智能运维能力包括哪些方面

在构建一个地铁智能运维系统中&#xff0c;我们需要接入哪些关键数据以实现高效和智能化的运维管理&#xff1f;地铁智能运维能力包含哪些方面&#xff1f;如何提升地铁系统的整体运营效率和安全性&#xff1f;  在构建地铁智能运维系统时&#xff0c;应连接以下关键数据&…

第十八篇【传奇开心果短博文系列】Python的OpenCV库技术点案例示例:图像修复和恢复

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例系列短博文目录前言一、常用的图像修复与恢复技术二、插值方法示例代码三、基于纹理合成的方法示例代码四、基于边缘保持的方法示例代码五、基于图像修复模型的方法示例代码六、基于深度学习的方法示例代码七…

AutoSAR(基础入门篇)7.1-汽车电子开发软件DaVinci Developer界面简介

目录 一、Dev界面简介 二、Dev使用流程简介 一、Dev界面简介 经典的是更老的版本,博主这里用的是较新一点的版本,不过大家不必担心版本问题,因为操作几乎都一样。我们先简单浏览一遍这个界面,大致从 上往下看可以分为这么几部分: 1. 导航栏:File那一排 2. 工具栏&…

Redis集群模型

主从 全量同步 增量同步 哨兵 分片集群

微信小程序上传代码教程

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 小程序上传代码到gogs上面来 整体架构流程 小程序也要远程连接仓库&#xff0c;实现代码上传 技术名词解释 微信开发者工具gogs 技术细节 连接gogs仓库地址 微信小程序需要head将本地代码和gogs代码同步 小结 …

JAVA反射总结学习

初始反射反射的基本操作反射安全性问题 反射是指在Java运行状态中: 给定一个类对象(Class对象)&#xff0c;通过反射获取这个类对象(Class对象)的所有成员结构&#xff1b; 给定一个具体的对象&#xff0c;能够动态地调用它的方法及对任意属性值进行获取和赋值&#xff1b; …

[word] word如何打印背景和图片? #微信#其他#经验分享

word如何打印背景和图片&#xff1f; 日常办公中会经常要打印文件的&#xff0c;其实在文档的打印中也是有很多技巧的&#xff0c;可以按照自己的需求设定&#xff0c;下面给大家分享word如何打印背景和图片&#xff0c;一起来看看吧&#xff01; 1、打印背景和图片 在默认的…

离线数仓(一)【数仓概念、需求架构】

前言 今天开始学习数仓的内容&#xff0c;之前花费一年半的时间已经学完了 Hadoop、Hive、Zookeeper、Spark、HBase、Flume、Sqoop、Kafka、Flink 等基础组件。把学过的内容用到实践这是最重要的&#xff0c;相信会有很大的收获。 1、数据仓库概念 1.1、概念 数据仓库&#x…

《动手学深度学习(PyTorch版)》笔记8.3

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

【开源】JAVA+Vue.js实现计算机机房作业管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登录注册模块2.2 课程管理模块2.3 课时管理模块2.4 学生作业模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 课程表3.2.2 课时表3.2.3 学生作业表 四、系统展示五、核心代码5.1 查询课程数据5.2 新增课时5.3 提交作…

【PyTorch][chapter 15][李宏毅深度学习][Neighbor Embedding-LLE]

前言&#xff1a; 前面讲的都是线性降维&#xff0c;本篇主要讨论一下非线性降维. 流形学习&#xff08;mainfold learning&#xff09;是一类借鉴了拓扑流行概念的降维方法. 如上图,欧式距离上面 A 点跟C点更近&#xff0c;距离B 点较远 但是从图形拓扑结构来看&#xff0c; …

「C++ 类和对象篇 10」初始化列表

目录 一、什么是初始化列表&#xff1f; 二、为什么需要初始化列表&#xff1f; 三、初始化列表怎么使用&#xff1f; 3.1 在构造函数中使用初始化列表 3.2 注意 3.3 结论 3.4 应用场景 四、初始化列表的初始化顺序 五、另一种初始化成员变量的方法 【总结】 一、什么是初始化…

C++入门篇(4)—— 类与对象(1)

目录 1.类的引入 2.类的定义 3.类的访问限定符 4.类的作用域 5. 类对象的存储方式 6. this指针 6.1 this指针的引入 6.2 this指针的特性 6.3有意思的面试题 1.类的引入 C语言struct 结构体中只能定义变量&#xff0c;而C中可以定义函数。 struct Date {void Init(int…

vue常用9个事件修饰符

第075个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使用&#xff0c;computed&a…

vueRouter中Hash模式和History模式有什么区别

VueRouter是Vue.js官方推荐的前端路由库&#xff0c;它提供了一种方便的方式来构建单页应用&#xff08;SPA&#xff09;。在使用VueRouter时&#xff0c;我们可以选择不同的路由模式&#xff0c;其中最常见的是Hash模式和History模式。本文将深入探讨这两种模式的区别&#xf…