代码随想录打卡第十三天

代码随想录–二叉树部分

day13 二叉树第一天


文章目录

  • 代码随想录--二叉树部分
  • 二叉树基础知识
  • 一、力扣144--二叉树的前序遍历(递归)
  • 二、力扣145--二叉树的后序遍历(递归)
  • 三、力扣94--二叉树的中序遍历(递归)
  • 四、力扣144--二叉树的前序遍历(迭代)
  • 五、力扣145--二叉树的后序遍历(迭代)
  • 六、力扣94--二叉树的中序遍历(迭代)
  • 七、力扣144--二叉树的前序遍历(统一迭代)
  • 八、力扣145--二叉树的后序遍历(统一迭代)
  • 九、力扣94--二叉树的中序遍历(统一迭代)
  • 十、力扣102--二叉树的层序遍历


二叉树基础知识

代码随想录知识链接:代码随想录

几个核心概念
满二叉树:结点的度只有0和2,且度为0的节点在同一层
完全二叉树:除了最后一层,其他层都满节点,最后一层的节点从左往右排
二叉搜索树:带值的二叉树,左节点<根节点<右节点
平衡二叉树:空树或左右子树高度差不大于1

遍历方法:
今天的题目都是遍历,在题目中介绍

一、力扣144–二叉树的前序遍历(递归)

代码随想录知识链接:代码随想录

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

前序遍历意思就是根节点->左节点->右节点这种顺序遍历下去,先用递归方法

定义一个子函数,接受一个根节点,如果根节点为null就return,否则先递归其左节点,再递归其右节点

代码如下:

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

二、力扣145–二叉树的后序遍历(递归)

代码随想录知识链接:代码随想录

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

后序遍历就是从子节点先遍历,左节点->右节点->根节点,调换一下子函数的顺序就行

代码如下:

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

三、力扣94–二叉树的中序遍历(递归)

代码随想录知识链接:代码随想录

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

中序的顺序是左节点->根节点->右节点

代码如下:

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

四、力扣144–二叉树的前序遍历(迭代)

代码随想录知识链接:代码随想录

这次用迭代方法来遍历。递归的实现本身是每次递归调用都把函数压入调用栈中,等递归结束时,就从栈顶弹出上次递归的参数,迭代法也就是模拟这个过程。

前序是中左右,但是因为栈是先入后出,所以实际上压栈的顺序应该是右左中

代码如下:

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

五、力扣145–二叉树的后序遍历(迭代)

代码随想录知识链接:代码随想录

同样的,用遍历+栈模拟递归过程,先序是中左右,后序是左右中,也就是中右左的逆序,而中右左是很好调整的

代码如下:

class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {vector<int> result;stack<TreeNode*> st;if(root == nullptr) return result;st.push(root);while(!st.empty()){TreeNode * curr = st.top();result.push_back(curr->val);st.pop();if(curr->left)st.push(curr->left);if(curr->right)st.push(curr->right); // switch order}reverse(result.begin(), result.end()); // reverse the resultreturn result;}
};

六、力扣94–二叉树的中序遍历(迭代)

代码随想录知识链接:代码随想录

中序遍历不管怎么调整,都没法把根节点放在第一位处理,它只能在中间,所以代码没法像前后序那么简单

所以这里栈就可以用来存指针,遍历到底部后,再出栈处理数字
请添加图片描述

代码如下:

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

七、力扣144–二叉树的前序遍历(统一迭代)

代码随想录知识链接:代码随想录

迭代法明显没有递归法那样漂亮,无法做到三种顺序改一点就能用,所以对迭代法改进,使其更漂亮更易用

其实相当于都写成中序遍历的样子,但是在遍历过未处理的节点入栈后,增加一个NULL指针也入栈,来表示该节点可以输出了

这样不同的遍历顺序只需要改入栈顺序就行,这样就和递归法一样了

代码如下:

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

八、力扣145–二叉树的后序遍历(统一迭代)

代码随想录知识链接:代码随想录

前序是中左右,入栈顺序是右左中,那么后序是左右中,则入栈顺序是中右左

class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {vector<int> result;stack<TreeNode*> st;if (root != NULL) st.push(root);while (!st.empty()) {TreeNode* node = st.top();if (node != NULL) {st.pop();st.push(node);                          st.push(NULL);if (node->right) st.push(node->right);  if (node->left) st.push(node->left);    } else {st.pop();node = st.top();st.pop();result.push_back(node->val);}}return result;}
};

九、力扣94–二叉树的中序遍历(统一迭代)

代码随想录知识链接:代码随想录

中序输出是左中右,那入栈顺序就是右中左

代码如下:

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

十、力扣102–二叉树的层序遍历

代码随想录知识链接:代码随想录

前中后序遍历都是深度优先遍历,层序遍历就是广度优先了

用队列实现,每次将出队元素的子节点入队,直到队空即可

代码如下:

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> result;queue<TreeNode *> que;if(root != nullptr) que.push(root);{while(!que.empty()){vector<int> temp;int length = que.size();for(int i = 0;i < length; i++) // Use all nodes in this while loop{TreeNode * curr = que.front();que.pop();if(curr->left != nullptr) que.push(curr->left);if(curr->right != nullptr) que.push(curr->right);temp.push_back(curr->val);}result.push_back(temp);}}return result;}
};

不同于深度优先的是,在while里面处理节点时,需要把该次while循环的元素都遍历其子节点,不然又成深度优先了

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【密码学】哈希函数与加密算法的关系

一、哈希函数的定义 哈希函数&#xff08;Hash Function&#xff09;&#xff0c;也被称为散列函数或杂凑函数&#xff0c; 是一种将任意长度的输入数据&#xff08;通常称为“预映射”或“消息”&#xff09;转换为固定长度输出&#xff08;通常称为“哈希值”、“散列值”、“…

Kotlin linkedMapOf filterKeys

Kotlin linkedMapOf filterKeys fun main(args: Array<String>) {val lhm linkedMapOf<String, Any>(Pair("name", "phil"), //因为key相同都为 name&#xff0c;被后面的覆盖。Pair("year", 2024),Pair("name", "f…

Gradle基础:从入门到掌握

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 在现代软件开发中&#xff0c;自动化构建工具是提高效率和管理依赖的重要手段。而Gradle作为一种灵活且强大的构…

SRS流媒体服务器概述

SRS/5.0(Bee) is a simple, high efficiency and realtime video server, supports RTMP, WebRTC, HLS, HTTP-FLV, SRT, MPEG-DASH and GB28181. 翻译&#xff1a;SRS/5.0(Bee)是一款简洁、高效、实时的视频服务器&#xff0c;支持RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DAS…

欧美海外媒体发稿,国外新闻发布,外媒发布

欧美媒体的影响力 欧美媒体在全球范围内具有较大的影响力&#xff0c;其发稿内容更具全球化视野和多样化观点。欧美媒体多以英语为主要报道语言&#xff0c;覆盖的领域包括政治、经济、文化、科技等多个方面。例如&#xff0c;BBC、CNN、纽约时报等媒体机构的新闻报道被广泛引…

zdppy+onlyoffice+vue3解决文档加载和文档强制保存时弹出警告的问题

解决过程 第一次排查 最开始排查的是官方文档说的 https://api.onlyoffice.com/editors/troubleshooting#key 解决方案。参考的是官方的 https://github.com/ONLYOFFICE/document-server-integration/releases/latest/download/Python.Example.zip 基于Django的Python代码。 …

Linux 复现Docker NAT网络

Linux 复现Docker NAT网络 docker 网络的构成分为宿主机docker0网桥和为容器创建的veth 对构成。这个默认网络命名空间就是我们登陆后日常使用的命名空间 使用ifconfig命令查看到的就是默认网络命名空间&#xff0c;docker0就是网桥&#xff0c;容器会把docker0当成路由&…

容联云发布容犀大模型应用,重塑企业“营销服”|WAIC 2024

7月6日&#xff0c;在2024世界人工智能大会上&#xff0c;容联云成功举办主题为“数智聚合 产业向上”的生成式应用与大模型商业化实践论坛。 论坛上&#xff0c;容联云发布了容犀智能大模型应用升级&#xff0c;该系列应用包括容犀Agent Copilot、容犀Knowledge Copilot、容犀…

User parameters 用户参数与Web监控

目录 一. 自定义键介绍 二. 制作步骤 1. 添加无可变部分参数 2. 添加有可变参数 3. 使用用户参数监控php-fpm 服务的状态 三. Web页面导入应用监控 四. Web监控 主要功能和操作&#xff1a; 开启方式 官方预定义监控项文档https://www.zabbix.com/documentation/6…

代码随想录(day1)二分法

if语句的基本语法 if 要判断的条件: 条件成立的时候&#xff0c;要做的事举例&#xff1a; if nums[middle]<target:leftmiddle1 while语句的基本语法&#xff1a; while 判断条件(condition)&#xff1a;执行语句(statements)举例&#xff1a; while left<right:midd…

【小鸡案例】表单focus和blur事件用法

input中有2个属性&#xff0c;一个是focus获取焦点&#xff0c;一个是blur失去焦点。获取焦点就是我们点击输入框时输入框被选中&#xff1b;失去焦点即点击输入框以外的区域&#xff0c;今天就用这两种属性做一个点击输入框的动画效果。 先写个输入框&#xff0c;代码如下&am…

基于LabVIEW的设备安装螺栓连接设计

介绍了一种基于LabVIEW的辅助设备安装螺栓连接设计案例。通过LabVIEW软件&#xff0c;实现了从螺栓规格预估、强度校核到物料选用的整个流程的软件化&#xff0c;提高了设计效率和安装可靠性。 项目背景 在轨道车辆设备安装中&#xff0c;螺栓连接作为一种常见的紧固方式&…

【java计算机毕设】线上花店销售商城系统java MySQL ssm JSP maven项目代码源码+文档ppt

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】线上花店销售商城系统MySQL ssm JSP maven项目代码源码文档PPT 小组设计代码 2项目介绍 系统功能&#xff1a; 线上花卉小铺系统包括管理员、用户俩种角色。 用户端&#xff1a;1.注册登录&#xff1a;游客…

系统化学习 H264视频编码(02) I帧 P帧 B帧 引入及相关概念解读

说明&#xff1a;我们参考黄金圈学习法&#xff08;什么是黄金圈法则?->模型 黄金圈法则&#xff0c;本文使用&#xff1a;why-what&#xff09;来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法&#xff0c;理论方面会更多地讲清楚 音视频中概念的…

JavaWeb开发基础7个Web术语解析

7个Web术语 Website: static vs dynamic HTTP HTTP Requests GET vs POST Servlet Container Server: Web vs Application Content Type Website: static vs dynamic 网站内容包括文本、图片、音频、视频&#xff0c;通过URL来访问。网站分为静态网站和动态网站。 静态网…

HBuilder X 小白日记03-用css制作简单的交互动画

:hover选择器&#xff0c;用于选择鼠标指针浮动在上面的元素。 :hover选择器可用于所有元素&#xff0c;不只是链接 :link选择器 设置指向未被访问页面的链接的样式 :visited选择器 用于设置指向已被访问的页面的链接 :active选择器 用于活动链接

mp4视频太大怎么压缩不影响画质,mp4文件太大怎么变小且清晰度高

在数字化时代&#xff0c;我们常常面临视频文件过大的问题。尤其是mp4格式的视频&#xff0c;文件大小往往令人望而却步。那么&#xff0c;如何在不影响画质的前提下&#xff0c;有效地压缩mp4视频呢&#xff1f;本文将为您揭秘几种简单实用的压缩技巧。 在分享和存储视频时&am…

白嫖A100活动来啦,书生·浦语大模型全链路开源体系

扫码参加即可获得&#xff1a; 第一节 书生浦语大模型全链路开源体系 书生浦语大模型的开源历程。 从模型到应用的典型流程 书生浦语的开源体系&#xff0c;包含从数据、预训练、微调、部署、评测、应用等环节

C# Winform自制多轴力臂(简单易懂,方便扩展)

WinForms框架广泛应用于上位机开发领域&#xff0c;其中对力臂的精准控制是常见需求之一。本文深入探讨了如何创建自定义的多轴力臂图形控件&#xff0c;不仅涵盖了力臂图形控件的角度调节机制&#xff0c;还详细展示了如何实现力臂运动的生动动态效果&#xff0c;为开发者提供…

【web前端HTML+CSS+JS】--- JS学习笔记03

一、JS介绍 可以在前端页面上进行逻辑处理&#xff0c;来解决表单的验证等问题&#xff0c;提升效率&#xff0c;直接在前端提示问题&#xff0c;减少服务器压力 应用1&#xff1a;可以做静态验证和动态验证&#xff08;进行异步请求&#xff09; 应用2&#xff1a;可以解析后…