论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
职场与人生
›
IT职场那些事
›
力扣-二叉树遍历
力扣-二叉树遍历
冬雨财经
论坛元老
|
2025-4-3 07:47:00
|
显示全部楼层
|
阅读模式
楼主
主题
1555
|
帖子
1555
|
积分
4665
一、二叉树的递归遍历
关于递归要确定三件事情
递归函数的参数和返回值类型
递归的终止条件
递归的单层逻辑
二、二叉树的非递归遍历
递归本质上是使用栈去实现的,所以简朴的递归算法可以用栈去模拟实现。
以如下图片为例子,它的
前序遍历(中左右)是4 1 8 6 9;
后序遍历(左右中)是1 6 9 8 4;
中序遍历(左中右)是1 4 6 9 8。
2.1 二叉树的前序遍历和后序遍历
没那么困难,只要搞明确入栈、出栈操作代表着什么就行了。
2.1.1 二叉树的前序遍历
设存储结果的数组是 vector<int> result;
首先是根节点入栈,这是处置惩罚的出发点。(先访问的是根结点4,先处置惩罚的也是根结点4)
出栈:每次的出栈都是将
栈顶的元素node
弹出,送入到数组result中。这代表着要对此结点举行处置惩罚,对应地,会在栈中发生一些变化,对,就是入栈操作。
入栈:会将
出栈结点node
的两个孩子结点分别入栈,由于前序操作是”中左右“,栈是后进先出的,所以会让
出栈结点node
的右孩子先入栈、左孩子后入栈。
为了更好地从前序遍历过渡到后序遍历,我想对前序遍历先有个直观的认识。
从根结点出发,然后是对根节点的孩子举行处置惩罚,在入栈的时候是先right后left的,出栈时候会先left,对左孩子举行处置惩罚,以及左孩子的孩子们。
由此可见,前序遍历的结果是由根开始,从上到下,先左后右的。我特别想提示自己的是,要处置惩罚完一个结点后,他就不属于二叉树了(不再需要等待被遍历),所以单层逻辑永远是一个”根“和它的孩子,它们三个关系是相当紧密的。
2.1.2 二叉树的后序遍历
为什么是在前序遍历代码的基础上更改一下左右孩子入栈的顺序再多加一个数组翻转的操作,就可以实现二叉树的后序遍历??
我如今的想法是,后序遍历和前序遍历直观上来说都是从上到下的,只不外是左右的先后顺序差异,单层逻辑仍旧是一个”根“和它的孩子的处置惩罚方式,仍旧是相当紧密的关系。
2.2 二叉树的中序遍历
中序遍历是”左中右“,此时这个三角型结构(一个”根“和它的孩子)不是那么的稳固了,因为
要先找到最左下角的结点
,而非是先处置惩罚根节点了。所以二叉树的中序遍历要比上面讲的前序和后序遍历要麻烦一些。
中序遍历,先访问的是根结点4,先处置惩罚的却不是根结点4。
去模拟一下,看看是谁先入栈,又因为什么才能出栈。
先处置惩罚的一定是左下角的结点,所以由
根结点4
出发,会先将根结点的左孩子1入栈,如果1有左孩子要接着入栈,在这个过程中不对任何右孩子举行入栈操作。先处置惩罚的结点1先出栈进入数组result,但是结点1没有右孩子,所以不会再有操作。
根结点4的左子树齐备处置惩罚完了
,然后处置惩罚结点4,并将结点4的右孩子8入栈,此时,我可以以为:结点8是新的”根结点“。
根结点入栈,但是通常不是先处置惩罚。
参加左孩子筹划:让根结点的左孩子,左孩子的左孩子,左孩子的左孩子的左孩子……入栈,直到左下角结点也入栈。
出栈处置惩罚:然后对
栈顶的结点元素top
举行弹出,写入到数组result中,将top的右孩子入栈,可以以为这个top的右孩子是新的“根结点”,继续举行参加左孩子筹划。
左孩子筹划完成后就举行出栈处置惩罚操作,也就是“参加左孩子筹划”和“出栈处置惩罚”是瓜代举行的。
三、代码
3.1 二叉树中序遍历-非递归方式
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> result;
if(root == nullptr) return result;
// st.push(root);这里不能压入根结点
TreeNode* cur = root;
TreeNode* node = root;
while(cur!= nullptr || !st.empty()){
//加入左孩子计划
if(cur != nullptr){
st.push(cur);
cout<<cur->val<<"入栈"<<endl;
cur = cur->left;
} else{//出栈处理操作
node = st.top();
cout<<"加入数组中"<<node->val<<endl;
result.push_back(node->val);
st.pop();
cur = node->right;
}
}
return result;
}
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
冬雨财经
论坛元老
这个人很懒什么都没写!
楼主热帖
信息与网络安全期末复习(完整版) ...
iOS全埋点解决方案-手势采集 ...
ts保姆级教程,别再说你不会ts了 ...
如何通过JDBC访问MySQL数据库?手把手 ...
Elasticsearch学习系列五(零停机索引 ...
Pod概述
Fastjson反序列化
Linux安装PHP8 新版笔记
Log4j2 CVE-2021-44288 代码审计(底层 ...
Java 将HTML转为XML
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
人工智能
开源技术
Postrge-SQL技术社区
快速回复
返回顶部
返回列表