力扣刷题-二叉树-二叉树的非递归遍历
参考:https://www.programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E8%BF%AD%E4%BB%A3%E9%81%8D%E5%8E%86.html#%E6%80%9D%E8%B7%AF
思路
为什么可以用迭代法(非递归的方式)来实现二叉树的前后中序遍历呢?
我们在栈与队列:匹配问题都是栈的强项中提到了,递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。
此时大家应该知道我们用栈也可以是实现二叉树的前后中序遍历了。
前序遍历(迭代法)
前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子。
为什么要先加入 右孩子,再加入左孩子呢? 因为这样出栈的时候才是中左右的顺序。
动画如下:

# 迭代法 使用栈实现
class TreeNode(object):def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution(object):def preorderTraversal(self, root): # 传入根节点 为TreeNode类型if not root:return []stack = [root] # 第一个根节点 先存入栈中(因为是中左右的顺序)result = [] # 结果while stack:node = stack.pop() # 从栈内删除该节点并返回该值 上面已经判断过root是否为空result.append(node.val)if node.right: # 注意是nodestack.append(node.right)if node.left:stack.append(node.left)return result
后序遍历(迭代法)
再来看后序遍历,先序遍历是中左右,后续遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中了,如下图:

# 迭代法 使用栈实现
class TreeNode(object):def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution(object):def postorderTraversal(self, root): # 传入根节点 为TreeNode类型if not root:return []stack = [root] # 第一个根节点 先存入栈中(因为是中左右的顺序)result = [] # 结果while stack:node = stack.pop() # 从栈内删除该节点并返回该值 上面已经判断过root是否为空result.append(node.val)if node.left:stack.append(node.left)if node.right: # 注意是nodestack.append(node.right)return result[::-1]
中序遍历
# 迭代法 实现中序遍历
class TreeNode(object):def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution(object):def inorderTraversal(self, root):if not root:return []stack = [] # 注意不能提前加入rootresult = []cur = root # 定义一个当前遍历节点的指针while cur or stack: # 用or# 一路向左if cur:stack.append(cur)cur = cur.left# 到达最左节点 开始处理else:cur = stack.pop() # 删除栈顶的值result.append(cur.val) # 加入至resultcur = cur.rightreturn result
相关文章:
力扣刷题-二叉树-二叉树的非递归遍历
参考:https://www.programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E8%BF%AD%E4%BB%A3%E9%81%8D%E5%8E%86.html#%E6%80%9D%E8%B7%AF 思路 为什么可以用迭代法(非递归的方式)来实现二叉树的前后中序遍历呢? 我们在栈与…...
react_15
动态菜单 图标要独立安装依赖 npm install ant-design/icons 图标组件,用来将字符串图标转换为标签图标 import * as icons from "ant-design/icons"; interface Module {[p: string]: any; } const all: Module icons; export default function Ico…...
关于ROS的网络通讯方式TCP/UDP
一、TCP与UDP TCP/IP协议族为传输层指明了两个协议:TCP和UDP,它们都是作为应同程序和网络操作的中介物。 **TCP(Transmission Control Protocol)协议全称是传输控制协议,是一种面向连接的、可靠的、基于字节流的传输…...
Leetcode—421.数组中两个数的最大异或值【中等】明天写一下字典树做法!!!
2023每日刷题(十九) Leetcode—421.数组中两个数的最大异或值 算法思想 参考自灵茶山艾府 实现代码 class Solution { public:int findMaximumXOR(vector<int>& nums) {int maxValue *max_element(nums.begin(), nums.end());int highId…...
数智赋能!麒麟信安参展全球智慧城市大会
10月31日至11月2日,为期三天的2023全球智慧城市大会长沙在湖南国际会展中心举办,大会已连续举办12届,是目前全球规模最大、专注于城市和社会智慧化发展及转型的主题展会。长沙市委常委、常务副市长彭华松宣布开幕,全球智慧城市大会…...
基础课21——知识库管理
1.知识库的概念、特点与功能 智能客服中的知识库是一个以知识为基础的系统,可以明确地表达与实际问题相对应的知识,并构成相对独立的程序行为主体,有利于有效、准确地解决实际问题。它储存着机器人对所有信息的认知概念和理解,这…...
网络运维Day01
文章目录 环境准备OSI七层参考模型什么是协议?协议数据单元(PDU)设备与层的对应关系什么是IP地址?IP地址分类IP的网络位和主机位IP地址默认网络位与主机位子网掩码默认子网掩码查看IP地址安装CISCO汉化CISCO(可选操作) CISCO之PC机器验证通信 CISCSO之交…...
从零配置一台linux主机
1. Linux软件安装方式 软件安装教程 设置国内源 因为 linux 本身自带的下载源资源有限,所以在使用 apt 命令下载的时候,有些包可能找不到,所以要添加国内源。方法如下: 打开文件 /etc/apt/sources.list sudo gedit /etc/apt/s…...
【蓝桥每日一题]-倍增(保姆级教程 篇1)
今天讲一下倍增 目录 题目:忠诚 思路: 题目:国旗计划 思路: 查询迭代类倍增: 本质是一个一个选区间使总长度达到 M,类似凑一个数。而我们会经常用不大于它最大的二的次幂,减去之后,再重复这…...
CNN(卷积神经网络)、RNN(循环神经网络)和GCN(图卷积神经网络)
CNN(卷积神经网络): 区别:CNN主要适用于处理网格状数据,如图像或其他二维数据。它通过卷积层、池化层和全连接层来提取和学习输入数据的特征。卷积层使用卷积操作来捕捉局部的空间结构,池化层用于降低特征图…...
在markdown中怎么画表格
2023年11月5日,周日上午 下面是一种常用的方式来编写表格: | 列1标题 | 列2标题 | 列3标题 | |:------:|:------:|:------:| | 内容 | 内容 | 内容 | | 内容 | 内容 | 内容 |在这个示例中,第一行用于定义表格的列标…...
每天五分钟计算机视觉:搭建手写字体识别的卷积神经网络
本文重点 我们学习了卷积神经网络中的卷积层和池化层,这二者都是卷积神经网络中不可缺少的元素,本例中我们将搭建一个卷积神经网络完成手写字体识别。 卷积和池化的直观体现 手写字体识别 手写字体的图片大小是32*32*3的,它是一张 RGB 模式的图片,现在我们想识别它是从 …...
【React】【react-globe.gl】3D Objects效果
目录 想要实现的效果实现过程踩坑安装依赖引入页面 想要实现的效果 示例地址 实现过程 踩坑 示例是通过script引入的依赖,但本人需要在react项目中实现该效果。按照react-globe.gl官方方法引入总是报错 Cant import the named export AmbientLight from non EcmaS…...
目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】SLAM(补充篇)
目录 前言 知识储备 SLAM基础知识 算法原理 什么是SLAM SLAM算法框架...
Pytorch 缓解过拟合和网络退化
一 添加BN模块 BN模块应该添加 激活层前面 在模型实例化后,我们需要对BN层进行初始化。PyTorch中的BN层是通过nn.BatchNorm1d或nn.BatchNorm2d类来实现的。 bn nn.BatchNorm1d(20) # 对于1D输入数据,使用nn.BatchNorm1d;对于2D输入数据&am…...
【算法】昂贵的聘礼(dijkstra算法)
题目 年轻的探险家来到了一个印第安部落里。 在那里他和酋长的女儿相爱了,于是便向酋长去求亲。 酋长要他用 10000 个金币作为聘礼才答应把女儿嫁给他。 探险家拿不出这么多金币,便请求酋长降低要求。 酋长说:”嗯,如果你能够替我…...
hackergame2023菜菜WP
文章目录 总结Hackergame2023更深更暗组委会模拟器猫咪小测标题HTTP集邮册Docker for everyone惜字如金 2.0Git? Git!高频率星球低带宽星球小型大语言模型星球旅行日记3.0JSON ⊂ YAML? 总结 最近看到科大在举办CTF比赛,刚好我学校也有可以参加,就玩了…...
ubuntu20.04.6使用FTP-及相关安全配置
前言: 作为一名运维,对文件系统,网络,文件共享,内存,CPU,以及一些应用服务及监控相关的知识需要 了解。今天是自己第一次搭建FTP(以前用过smb,windows共享,FT…...
C++中不允许复制的类
C中不允许复制的类 假设您需要模拟国家的政体。一个国家只能有一位总统,而 President 类面临如下风险: President ourPresident; DoSomething(ourPresident); // duplicate created in passing by value President clone; clone ourPresident; // dup…...
使用Python 脚自动化操作服务器配置
“ 有几十台特殊的服务器,没有合适的批量工具只能手动,要一个一个进行点击设置很耗费时间呀\~”,使用 Python 的简单脚本,即可模拟鼠标键盘进行批量作业 01 — 自动化示例 以某服务器中的添加用户权限为例,演示过程皆未触碰鼠标…...
从零开始:用正则表达式处理日期时间格式的完整指南
从零开始:用正则表达式处理日期时间格式的完整指南 在数据处理和文本分析中,日期时间格式的校验一直是个高频需求。无论是表单验证、日志分析还是数据清洗,确保日期时间格式的正确性都至关重要。正则表达式作为文本处理的瑞士军刀,…...
公司内部业务系统,其实无需专门开发,用免费低代码平台就够了
这段时间陆续试了几款主流低代码工具,整体体验下来,有些平台在免费阶段就已经很好用了。整理了一份我觉得比较值得尝试的清单,分享给同样有需求的人。斑斑AI首先是斑斑AI。它给我最大的感受就是“没有限制”。完全无限制免费这一点非常少见&a…...
利用通义千问模型辅助C语言学习:从基础语法到指针难题解析
利用通义千问模型辅助C语言学习:从基础语法到指针难题解析 学C语言,是不是经常卡在某个概念上,比如那个让人又爱又恨的“指针”?或者写了一段代码,运行结果和预想的完全不一样,却死活找不到原因࿱…...
保姆级教程:在银河麒麟V10桌面版上,用Docker容器化部署SpringBoot + 达梦数据库应用
银河麒麟V10桌面版容器化实战:SpringBoot与达梦数据库的Docker化部署指南 在国产化技术栈日益成熟的今天,将传统应用迁移到容器化环境已成为提升部署效率和系统可移植性的关键路径。银河麒麟V10作为国产操作系统的代表,结合飞腾CPU的硬件生态…...
bat脚本从入门到实战:10个常用技巧提升你的Windows自动化效率
BAT脚本从入门到实战:10个常用技巧提升你的Windows自动化效率 在Windows系统中,BAT批处理脚本就像一位不知疲倦的助手,能够24小时待命执行各种重复性任务。想象一下,每天上班第一件事是打开五个开发工具、三个文档和一个数据库客户…...
springboot交通道路监测感知与车路协同系统可视化大屏
目录技术架构设计数据采集与处理可视化大屏功能模块系统集成与部署关键技术点测试与迭代项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术架构设计 采用SpringBoot作为后端框架,提供RESTful API接口;…...
SecGPT-14B实战手册:Chainlit中集成Markdown渲染与代码块语法高亮
SecGPT-14B实战手册:Chainlit中集成Markdown渲染与代码块语法高亮 1. SecGPT-14B简介 SecGPT是由云起无垠推出的开源大语言模型,专门针对网络安全领域优化。该模型基于先进的自然语言处理技术,能够理解和生成与网络安全相关的专业内容。 S…...
Crawl4AI浏览器配置文件创建与键盘交互处理终极指南:打造个性化爬虫身份
Crawl4AI浏览器配置文件创建与键盘交互处理终极指南:打造个性化爬虫身份 【免费下载链接】crawl4ai 🔥🕷️ Crawl4AI: Open-source LLM Friendly Web Crawler & Scrapper 项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai…...
搭建专属汽车电子测试 AI 助手
专栏:《AI 汽车电子测试实战》第 15 篇 作者:一线汽车电子测试工程师 适合人群:想搭建私有 AI 助手的测试团队、关注数据安全的工程师开篇:为什么需要专属 AI 助手? 这是我上个月在某车企的 AI 部署项目中的真实经历。…...
进阶篇第5节:共享内存(三)——实战:优化矩阵乘法(Tiling技术)
第二篇进阶篇第5节:共享内存(三)——实战:优化矩阵乘法(Tiling技术) 从朴素到分块,从分块到极致——矩阵乘法的优化之路,就是CUDA性能优化的缩影 写在前面 矩阵乘法是CUDA优化中最经典的案例,没有之一。在筑基篇,我们实现了朴素版本和基础分块版本,性能从 252 GFLO…...
