重拾C++之菜鸟刷算法第7篇---二叉树(上)

二叉树

理论基础

  • 次序关系 前中后序 ( VLR, LVR, LRV )

VLR: 前表示根节点在前面,遍历顺序即中左右

LVR: 中表示根节点在中间,遍历顺序即左中右

LRV: 后表示根节点在后面,遍历顺序即左右中

  • 遍历方式

DFS (深度优先遍历)- 先往深处走,遇到叶子节点再往回走 :前中后序遍历

BFS(广度优先遍历)- 一层一层遍历:层次遍历

  • 二叉树节点构造
struct TreeNode{int val;TreeNode left;TreeNode right;TreeNode (int x): val(x), left(NULL), right(NULL);
}

一、递归遍历

1. 前序遍历

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

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

题解

class Solution {
public:void traverse(TreeNode * cur, vector<int> &result){if(cur == nullptr) return;result.push_back(cur->val);traverse(cur->left, result);traverse(cur->right, result);}vector<int> preorderTraversal(TreeNode* root) {vector<int> result;traverse(root, result);return result;}
};

2. 后序遍历

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

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

题解

class Solution {
public:void traverse(TreeNode * cur, vector<int> &result){if(cur == nullptr) return;traverse(cur->left, result);traverse(cur->right, result);result.push_back(cur->val);}vector<int> postorderTraversal(TreeNode* root) {vector<int> result;traverse(root, result);return result;}
};

3. 中序遍历

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

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

题解

class Solution {
public:void traverse(TreeNode * cur, vector<int> &result){if(cur == nullptr){return ;}traverse(cur->left, result);result.push_back(cur->val);traverse(cur->right, result);}vector<int> inorderTraversal(TreeNode* root) {vector<int> result;traverse(root, result);return result;}
};

二、非递归遍历

知识点

  • 非递归使用栈,先进后出

1. 前序遍历

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

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

题解

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {stack<TreeNode*> stk;vector<int> result;if (root == nullptr) return result;stk.push(root);while(!stk.empty()){TreeNode *tmp = stk.top();stk.pop();if(tmp != nullptr) result.push_back(tmp->val); // 中else continue;stk.push(tmp->right); // 右stk.push(tmp->left); // 左}return result;}
};

2. 后序遍历

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

与前序遍历相似,前序遍历非递归是中右左

修改右左位置为左右,那么就是中左右,再反转成为右左中

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

题解

class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {stack<TreeNode*> stk;vector<int> result;if(root == nullptr) return result;stk.push(root);while(!stk.empty()){TreeNode *tmp = stk.top();stk.pop();if(tmp != nullptr) result.push_back(tmp->val);else continue;stk.push(tmp->left);stk.push(tmp->right);} reverse(result.begin(), result.end());// 没有返回值,直接修改原容器return result;}
};

3. 中序遍历

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

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

题解

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {stack<TreeNode*> stk;vector<int> result;TreeNode *cur = root;while(cur != nullptr || !stk.empty()){if(cur != nullptr){stk.push(cur);cur = cur->left;}else{cur = stk.top(); stk.pop();result.push_back(cur->val);cur = cur->right;}}return result;}
};

三、二叉树层序遍历

知识点

  • 使用一个队列来存储每一次遍历的元素,size的设置则是记录当前层有多少个元素
  • 使用一维数组记录每一层的元素,使用二维数组来记录整棵树

1. 二叉树层次遍历

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

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {queue<TreeNode*> q; vector<vector<int>> result;if(root == nullptr) return result;q.push(root);while(!q.empty()){int size = q.size();vector<int> vec;while(size--){TreeNode *node = q.front();q.pop();vec.push_back(node->val);if(node->left) q.push(node->left);if(node->right) q.push(node->right);}result.push_back(vec);} return result;}
};

2. 二叉树层次遍历II

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

class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root) {vector<vector<int>> result;queue<TreeNode*> q;if(root == nullptr) return result;q.push(root);while(!q.empty()){vector<int> vec;int size = q.size();while(size--){TreeNode * node = q.front();q.pop();vec.push_back(node->val);if(node->left) q.push(node->left);if(node->right) q.push(node->right);}result.push_back(vec);}reverse(result.begin(), result.end());return result;}
};

3. 二叉树的右视图

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

199. 二叉树的右视图 - 力扣(LeetCode)

class Solution {
public:vector<int> rightSideView(TreeNode* root) {queue<TreeNode*> q;vector<int>result;if(root == nullptr) return result;q.push(root);while(!q.empty()){int size = q.size();vector<int> vec;while(size--){TreeNode *node = q.front();q.pop();vec.push_back(node->val);if(node->left) q.push(node->left);if(node->right) q.push(node->right);}result.push_back(vec.back());}return result;}
};

四、翻转二叉树

题目

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

递归三步走

  • 确定递归函数的参数和返回值

参数就是传入的指针,返回根据题目要求是root节点

  • 确定终止条件

节点为空则返回

  • 单层递归逻辑

前序遍历和后序遍历都可以

226. 翻转二叉树 - 力扣(LeetCode)

题解

class Solution {
public:TreeNode* invertTree(TreeNode* root) {// 根节点为空if(root == nullptr) return root;// 迭代swap(root->right, root->left);invertTree(root->left);invertTree(root->right);return root;}
};

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

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

相关文章

Databend 开源周报第 134 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持多语句事务…

基于dashscope在线调用千问大模型

前言 dashscope是阿里云大模型服务平台——灵积提供的在线API组件。基于它&#xff0c;无需本地加载大模型&#xff0c;通过在线方式访问云端大模型来完成对话。 申请API key 老规矩&#xff1a;要想访问各家云端大模型&#xff0c;需要先申请API key。 对于阿里云&#x…

STM32(14)USART

USART:一种片上外设&#xff0c;用来实现串口通信&#xff0c;就是stm32内部的串口 USART简介 串并转换电路 串行通信和并行通信 串行&#xff1a;一根数据线&#xff0c;逐个比特位发送 为什么要串并转换 移位寄存器 USART的基本模型 通过查询SR&#xff08;状态寄存器&…

简介IP地址证书如何申请

IP地址证书通常包含在SSL/TLS证书中&#xff0c;根据验证级别可分为域名验证型(DV)、组织验证型(OV)。对于直接绑定IP地址的场景&#xff0c;需选择支持IP地址验证的SSL证书。 跟常见的域名证书一样&#xff0c;IP地址证书在申请过程中同样需要验证IP的所有权&#xff0c;常见的…

Go语言基础

简介 Go语言&#xff08;也称为Golang&#xff09;是一种静态类型、编译型语言&#xff0c;由Google的Robert Griesemer、Rob Pike和Ken Thompson于2007年设计&#xff0c;首次公开发布于2009年。Go的设计初衷是解决当时谷歌内部面临的软件开发问题&#xff0c;特别是在处理大…

Sublime Text4代码配色自定义方案

文章目录 前言Settings设置效果图 前言 关于Sublime Text对于我的使用体验&#xff0c;只能说内置的代码主题真的都太low了&#xff0c;一点都不好看。所以接下来我分享一下我自定义代码配色。当然&#xff0c;大家也可以通过我给的中文翻译注释来自定义自己喜欢的颜色。废话不…

Linux 设置快捷命令

以ll命令为例&#xff1a; 在 Linux 系统上&#xff0c;ll 命令通常不是一个独立的程序&#xff0c;而是 ls 命令的一个别名。 这个别名通常在用户的 shell 配置文件中定义&#xff0c;比如 .bashrc 或 .bash_aliases 文件中。 要在 Debian 上启用 ll 命令&#xff0c;你可以按…

神经网络结构——CNN、RNN、LSTM、Transformer !!

文章目录 前言 一、什么是CNN 网络结构 解决问题 工作原理 实际应用 二、什么是RNN 网络结构 解决问题 工作原理 应用场景 三、什么是LSTM 网络结构 解决问题 工作原理 应用场景 四、什么是Transformer 网络结构 解决问题 工作原理 BERT GPT 前言 本文将从什么是CNN&#xff1…

一个完整的Flutter项目的基本构成

目录 1.页面跳转2.本地数据库和读取2.1 在pubspec.yaml中添加数据库框架依赖2.2 创建db.dart 初始化数据库并创建表2.3 安装JsonToDart插件2.4 创建实体类 user_bean.dart2.5 增删改查&#xff1a; 3.网络请求数据解析UI渲染 本篇主要总结下一个完整的Flutter项目有哪些基本构成…

徐工集团与宁夏天元锰业集团召开战略合作会议

2024年3月3日&#xff0c;徐工集团党委书记、董事长杨东升一行考察宁夏天元锰业集团&#xff0c;并举行战略合作会议。宁夏天元锰业集团董事局主席贾天将及相关高管参加会议。双方围绕绿色低碳、智能化和信息化推进新一轮机械设备“以旧换新”&#xff0c;物流运输和矿山开采设…

【SpringBoot3】Spring Boot Event 自定义事件的发布与监听

一、基本概况 1、什么是SpringBoot自定义事件 Spring Boot自定义事件是Spring框架中事件处理机制的一种扩展&#xff0c;它允许开发者在Spring Boot应用程序中定义、发布和监听自己的事件。这些事件可以用于在应用程序的不同组件之间进行通信&#xff0c;实现解耦和异步处理。…

VSCode通过SSH连接Docker环境进行开发

文章目录 VSCode 插件Docker 镜像构建镜像部署环境 VSCode 连接本地Docker容器VSCode SSH连接Docker容器VSCode 打开容器内目录文件 VSCode 插件 Remote - SSH Docker 镜像 https://hub.docker.com/_/golang # Golang 镜像 docker pull golang:1.22构建镜像 Dockerfile F…

【ros2 control 机器人驱动开发】双关节多控制器机器人学习-example 3

【ros2 control 机器人驱动开发】双关节多控制器机器人学习-example 3 文章目录 前言一、创建controller相关二、编译测试三、测试运行测试forward_position_controller测试forward_velocity_controller测试forward_acceleration_controller总结前言 本篇文章在上篇文章的基础…

ThreadPoolExecutor 学习

ThreadPoolExecutor 是开发中最常用的线程池&#xff0c;今天来简单学习一下它的用法以及内部构造。 1、线程池存在的意义&#xff1f; 一般在jvm上&#xff0c;用户线程和操作系统内核线程是1&#xff1a;1的关系&#xff0c;也就是说&#xff0c;每次创建、销毁线程的时候&am…

day05-网络编程

1>广播 #include "test.h"#define SER_IP "192.168.42.106" #define SER_PORT 8888int main(int argc, const char *argv[]) {int sfd socket(AF_INET, SOCK_DGRAM, 0);if(sfd -1){perror("socket error");return -1;}int broadcast 1; i…

Python基础:标准库 -- Time 时间的访问和转换

1. 官方文档 time --- 时间的访问和转换 — Python 3.12.2 文档 2. 准备知识 协调世界时 UTC (Coordinated Universal Time) 协调世界时&#xff08;Coordinated Universal Time&#xff0c;UTC&#xff09;&#xff0c;是一种国际标准的时间表示方式。UTC 是以原子钟为基础…

【代码】Python3|无GUI环境中使用Seaborn作图的学习路线及代码(阴影折线图)

我有个需求是需要画图&#xff0c;让GPT帮我生成了一下学习计划。 学习路线依照GPT的来的&#xff0c;使用的Prompt工具是https://github.com/JushBJJ/Mr.-Ranedeer-AI-Tutor。 文章目录 PrerequisiteMain Curriculum1.1 Seaborn介绍Seaborn基础保存图形为文件练习 1.2 单变量数…

产品推荐 - GX-SOPC-5CEFA5-M484 FPGA核心开发板

● 核心板采用8层板精心设计 ● FPGA&#xff1a;采用Intel&#xff08;ALTERA&#xff09; Cyclone V 5CEFA5&#xff0c;Les为77K&#xff0c;内嵌存储器为4460Kb&#xff0c;硬件乘法器为300个&#xff0c;最大等效门数约2300万门&#xff1b;新增DSP Block&#xff08;150…

ssh远程登录Permission denied (publickey,gssapi-keyex,gssapi-with-mic)

SSH登录提示 Permission denied (publickey,gssapi-keyex,gssapi-with-mic).vi /etc/ssh/sshd_config PermitRootLogin yes PubkeyAuthentication yes PasswordAuthentication yes 重启ssh服务&#xff0c;并且设置开机自启服务systemctl restart sshd

pytorch项目代码记录

1.超过二维的张量写进csv #(20,204,273) -> (4080,273) ycsv []for i in range(20):ycsv.append(y[i, 8, :, :].reshape(204,273))with open(y.csv,w,encodingutf-8) as y_obj:writer csv.writer(y_obj)for j in range(20):writer.writerows(ycsv[j])data pd.read_csv(y…