当前位置:网站首页>二叉树前序遍历、中序遍历、后序遍历的迭代版
二叉树前序遍历、中序遍历、后序遍历的迭代版
2022-08-08 20:54:00 【三十而学】
二叉树前序遍历、中序遍历、后序遍历的迭代版
- 前序遍历
void preorder(TreeNode* root)
{
if(root==NULL)
return;
stack<TreeNode*> s;
while(root||!s.empty())
{
while(root)
{
//...处理root
s.push(root);
root=root->left;
}
root=s.top();
s.pop();
root=root->right;
}
}
- 中序遍历
void midorder(TreeNode* root)
{
if(root)
cout<<"empty!"<<endl;
stack<int> s;
while(root||!s.empty())
{
while(root)
{
s.push(root);
root=root->left;
}
root=s.top();
s.pop();
//...处理root
root=root->right;
}
}
- 后序遍历
void postorder(TreeNode* root)
{
stack<TreeNode*> s;
TreeNode * p = root;
TreeNode * lastVisited = NULL;//记录上一次访问过的节点
if(p == NULL)
return ans;
while(!s.empty() || p)
{
//不断往左孩子迭代,直到左孩子为空,同时路径上的节点入栈
if(p)
{
s.push(p);
p = p->left;
}
//此时p==NULL,到达了左下角节点
else
{
p = stk.top();
//右孩子为空,或者右孩子上次已经访问完
if(p->right == NULL || p->right == lastVisited)
{
//...处理p
lastVisited = p;//更新lastVisited
s.pop();
p = NULL;
}
else{
p = p->right;//这时p是第一次被访问,不能直接访问其指向的值,应该先访问右子树
}
}
}
return ans;
}
前序遍历和中序遍历基本一样,访问节点位置不一样,后序遍历相对复杂,关键在于lastvisited的追踪。
边栏推荐
- Kotlin基础稳固第一天
- 单片机——串口通信(从串口接收多位数据保存到数组,发送多位数据到串口)
- 【无标题】
- 莫让“学院派”限制我们的思维:在数组的中间位置删除数据一定比链表慢?
- 矩阵相乘
- Web3到底是什么?
- SQL-堆叠注入(含例题)
- The new database is online | CnOpenData information transmission, software and information technology service industry basic information data of industrial and commercial registered enterprises
- sudo控制用户权限实战操作
- SQL注入之搭建dnslog
猜你喜欢
随机推荐
磁控胶囊胃镜:具有良好耐受性的非侵入性胃镜检查
Flask 教程 第十一章:美化
Bluu海鲜公司推出首批实验室培育的鱼类产品
随手记:laravel、updateOrCreate 和 updateOrInsert 的区别
Kotlin's JSON format parsing
C#实现Everything——数据显示
学习笔记:线性表的顺序表示和实现(二级指针实现)
劳务派遣业务流程图
Kotlin reflection
pm2安装配置与基本命令你知道吗?
LitJson使用中的一些问题
莫让“学院派”限制我们的思维:在数组的中间位置删除数据一定比链表慢?
学习笔记:XML
基于opencv的实时睡意检测系统
amd和Intel的CPU到底哪个好?
有幸与美团大佬共同探讨单节点连接数超1.5W的问题
高数_复习_第3章:一元函数积分学
兼容并蓄广纳百川,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang复合容器类型的声明和使用EP04
MySQL权限管理
VSCode 必知必会的 20 个快捷键