首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
牛客734077141号
浙江大学 算法工程师
发布于浙江
关注
已关注
取消关注
@mtgo666:
二叉树的三种遍历(非递归)
1、简介我们在递归的时候说到过,一般我们如果想把递归的算法转换至非递归的实现,我们可以自己利用辅助栈来代替系统栈保存一些信息。所以在实现二叉树的三种非递归遍历的时候,我们需要开辟一个辅助栈来保存一些信息。2、二叉树结点结构/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/3、先序遍历2.1 实现思路我们只需要开辟一个栈,先让根节点入栈。只要栈不空,我们循环的访问栈内每一位结点,如果访问的当前结点有孩子,让结点的右孩子左孩子依次入栈即可。(因为栈是先进后出,先序遍历是根左右,所以我们入栈的时候是先让右孩子入栈)。3.2 代码实现class Solution {public: void preorderTraversal(TreeNode* root) { stack<TreeNode*> s; s.push(root); while(!s.empty()){ TreeNode *temp = s.top(); s.pop(); if(!temp) continue; cout<<temp->val<<" "; if(temp->right) s.push(temp->right); if(temp->left) s.push(temp->left); } }};4、中序遍历4.1 实现思路中序遍历的顺序是左根右,所以我们要先要访问到最左的那个结点(while(t){t= t->left})。在访问最左结点的过程中将路径上的结点入栈。然后当栈不为空的时候循环访问即可。比如说最左的结点是1号结点,其父节点是2号结点。那么在找1号结点的过程中2号结点必定已入栈并且在1号结点下面。所以访问完1号结点后,接着会访问2号结点,只需在访问完2号结点时,将当前指针指向其右子树就会去访问其右子树。总体下来的顺序就是左根右。4.2 代码实现class Solution {public: void inorderTraversal(TreeNode* root) { stack<TreeNode*> s; TreeNode *t = root; while(!s.empty() || t){ while(t){ //找到最左的那个结点 s.push(t); t = t -> left; } if(!s.empty()){ TreeNode *temp = s.top(); s.pop(); cout<<temp->val<<" "; t = temp->right; } } }};5、后序遍历5.1 实现思路后序遍历的非递归实现相较于先序和中序有点复杂。因为我们需要记录下结点的状态,后序遍历的顺序是左右根,我们在访问完左孩子去访问右孩子的时候,要经过根节点,所以我们要记录一下根结点的状态,如果这个根节点访问过了才输出。5.2 代码实现由于要记录每个结点的状态,我们有两种可以实现的方式:第一种是在二叉树结点的结构体内加一个标志位;第二种是我们采用对组的形式,每个结点绑定一个bool值。在这里我们使用对组的方式实现。class Solution {public: void postorderTraversal(TreeNode* root) { stack<pair<TreeNode*, bool> > s; s.push(make_pair(root, false)); //根节点入栈 bool visited; while(!s.empty()){ pair<TreeNode*, bool> p = s.top(); s.pop(); visited = p.second; if(!p.first){ continue; } if(visited){ //如果该节点被访问过才输出 cout<<p.first->val<<" "; } else { s.push(make_pair(p.first, true)); if(p.first->right) s.push(make_pair(p.first->right, false)); if(p.first->left) s.push(make_pair(p.first->left, false)); } } }};
点赞 0
评论 0
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
09-16 12:04
门头沟学院 Java
wxg一面
时长80min。上来问了20分钟不到八股,感觉对我不感兴趣,直接手撕,三道题。手撕完,看我用c++写的感觉又对我感了一点兴趣,问了十几分钟c++八股。反问:几轮技术面 面试表现总体面试体验还行,但是面试官跟我技术栈不太匹配。还有就是面wxg压力太大了。赶紧挂了吧我好被其他g捞。
我的秋招日记
点赞
评论
收藏
分享
09-14 12:23
华南理工大学 机械设计/制造
#三一集团职位已停止投递
兄弟们这是挂了的意思吗?
点赞
评论
收藏
分享
08-24 09:53
江西理工大学 Java
外卖+点评能找到实习吗
如图
shanhai1:
第一份实习挺看运气的
点赞
评论
收藏
分享
09-12 16:52
中国海洋大学 产品经理
京东产品经理面经
问题 1:自我介绍 问题 2:详细讲一个做过的功能? 回答 2:我通常按照背景、需求来源、需求评估、功能设计、需求评审/设计/开发/测试、数据效果来讲 - 背景:整个 APP 的背景(APP 产品定位、使用场景、用户画像、现阶段 APP 主要目的) - 需求来源:需求是从哪里来的?(这里主要讲的 c 端产品) 1. 产品战略规划:APP 处于不同的阶段可能有基于产品战略规划的需求,比如说产品早期,主要是搭功能,获取新客;中期更看重活跃、留存;后期需要转化(不全面,只是简单举个例子)。 2. 用户(APP 调研问卷、应用商店评论、客服...) ...
查看3道真题和解析
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
银行秋招
1.9W
2
...
出身寒微,却攥住鹅厂的入场券
1.0W
3
...
华为主管面准备笔记/适用于一切HR面经验贴
6210
4
...
那些未曾答上来的硬核面试问题
6119
携程秋招笔试
热聊中
5
...
27双非被美团激情拷打3h
4254
6
...
我眼里的悲伤
3249
7
...
来听我1000份面试经历的个人打分
3043
8
...
【26秋招】我是如何从男模上岸大厂程序员----上岸前的苦苦挣扎(2)
2928
9
...
机械结构单9硕求职寄录-9月
2289
10
...
第四个意向和米哈游拯救世界!!
2278
创作者周榜
更多
正在热议
更多
#
从顶到拉给所有面过的公司评分
#
20337次浏览
180人参与
#
机械人春招想让哪家公司来捞你?
#
357393次浏览
3109人参与
#
为了求职,我做过的疯狂伪装
#
12545次浏览
230人参与
#
晒晒你的中秋福利
#
15231次浏览
98人参与
#
职场破冰,你们都聊什么?
#
7258次浏览
75人参与
#
大家实习每天都在干啥
#
89076次浏览
518人参与
#
校招笔试
#
648次浏览
30人参与
#
机械笔面试考察这些知识点
#
10500次浏览
96人参与
#
你的公司给实习生发中秋礼物吗
#
1943次浏览
31人参与
#
bilibili求职进展汇总
#
89533次浏览
810人参与
#
工作压力大怎么缓解
#
105189次浏览
1052人参与
#
秋招OC许愿
#
346888次浏览
2530人参与
#
广联达求职进展汇总
#
11038次浏览
50人参与
#
机械人怎么评价今年的华为
#
208984次浏览
1524人参与
#
宣讲会你有哪些意向不到的收获
#
1427次浏览
22人参与
#
聊聊这家公司值得去吗
#
558967次浏览
3712人参与
#
你面试被问到过哪些不会的问题?
#
21935次浏览
817人参与
#
百度秋招提前批进度
#
150429次浏览
1770人参与
#
电网笔面经互助
#
46765次浏览
431人参与
#
秋招的嫡长offer
#
30566次浏览
285人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务