二叉树的四种遍历方法详解:递归与迭代实现
创作时间:
作者:
@小白创作中心
二叉树的四种遍历方法详解:递归与迭代实现
引用
1
来源
1.
https://www.cnblogs.com/tracyhan/p/5440319.html
二叉树的遍历是数据结构和算法中的基础内容,掌握二叉树的遍历方法对于理解更复杂的算法和数据结构至关重要。本文将详细介绍二叉树的四种遍历方法:前序遍历、中序遍历、后序遍历和层序遍历,并分别给出递归和迭代两种实现方式。
一、前序遍历
前序遍历的顺序是:根节点-左子树-右子树。
1. 递归遍历
void preorder(BinTree *T)
{
if(T==NULL)
return;
cout << T->data;
preorder(T->left);
preorder(T->right);
}
2. 迭代遍历(用栈实现)
void preorder2(BinTree *T)
{
if(T==NULL)
return;
stack<BinTree*>s;
BinTree *pcur;
pcur = T;
while (pcur || !s.empty())
{
if (pcur)
{
cout << pcur->data;
s.push(pcur);
pcur = pcur->left;
}
else
{
pcur = s.top();
s.pop();
pcur = pcur->right;
}
}
}
二、中序遍历
中序遍历的顺序是:左子树-根节点-右子树。
1. 递归遍历
void inorder(BinTree *T)
{
if(T == NULL)
return;
inorder(T->left);
cout << T->data;
inorder(T->right);
}
2. 迭代遍历(用栈实现)
void inorder2(BinTree *T)
{
if(T == NULL)
return;
stack<BinTree*>s;
BinTree *pcur;
pcur = T;
while (pcur || !s.empty())
{
if (pcur)
{
s.push(pcur);
pcur = pcur->left;
}
else
{
pcur = s.top();
s.pop();
cout << pcur->data;
pcur = pcur->right;
}
}
}
三、后序遍历
后序遍历的顺序是:左子树-右子树-根节点。
1. 递归遍历
void postorder(BinTree *T)
{
if (T==NULL)
return;
postorder(T->left);
postorder(T->right);
cout << T->data;
}
2. 迭代遍历(用栈实现)
void postorder2(BinTree *T)
{
if(T == NULL)
return;
stack<BinTree*>s;
s.push(T);
BinTree *pcur;
pcur = NULL;
while (!s.empty())
{
pcur = s.top();
if (pcur->left == NULL && pcur->right == NULL)
{
cout << pcur->data;
s.pop();
}
else
{
if(pcur->right)
{
s.push(pcur->right);
pcur->right = NULL;
}
if (pcur->left)
{
s.push(pcur->left);
pcur->left = NULL;
}
}
}
}
四、层序遍历
层序遍历是图的广度优先搜索的应用,常用队列结构实现。
1. 迭代遍历
void leveltraversal(BinTree *T)
{
queue<BinTree*> s;
s.push(T);
BinTree* pcur;
while (!s.empty())
{
pcur=s.front();
cout<<pcur->data;
s.pop();
if (pcur->left)
{
s.push(pcur->left);
}
if (pcur->right)
{
s.push(pcur->right);
}
}
}
2. 分层遍历二叉树
分层遍历二叉树,即从上到下按层次访问该树,每一层单独输出一行。
last等于节点1,1入队列,打印1并弹出1,将1的左右孩子放入队列,2入队列,并让nlast等于节点2,3入队列并让nlast等于节点3,此时发现last与之前出队列的1节点相等,换行,并将nlast赋给last(等于节点3)。
接下来,节点2出栈,打印节点2,并让结点2的孩子进入队列,节点4进入队列并让nlast等于节点4,节点3出队列并打印节点3,让节点3的孩子进入队列,节点5进入队列并让nlast等于节点5,节点6进入队列并让nlast等于节点6,此时发现last与上次出队列的节点3相等,于是换行,并将nlast赋给last(等于节点6),接下来类此。
void leveltraversal3(BinTree *T)
{
if(T == NULL)
return;
queue<BinTree*>s;
s.push(T);
BinTree *pcur,*last,*nlast;
last = T;
nlast = NULL;
while (!s.empty())
{
pcur = s.front();
cout << pcur->data;
s.pop();
if (pcur->left)
{
s.push(pcur->left);
nlast = pcur->left;
}
if (pcur->right)
{
s.push(pcur->right);
nlast = pcur->right;
}
if (last == pcur)
{
cout << endl;
last = nlast;
}
}
}
热门推荐
从抗日英雄到叛军头目:姜华亭的悲剧人生
成都美食攻略:十大经典美食带你领略麻辣天堂
姓名学三大运解读:以“李子琪”为例剖析吉凶
一文读懂青松成语:坚韧长寿的文化符号
金庸笔下的侠客:传统精神与现代人文主义的融合
胡萝卜吃多了,尿黄怎么办?
赤藓糖醇:糖尿病患者的甜蜜新选择
世界银行上调中国经济增长预期至4.9%,展现强大韧性与潜力
强磁场下的风险:磁共振检查的金属禁忌
健康改良版锅包肉:美味与健康的完美平衡
哺乳期妈妈饮食,宝宝健康的关键
三角纤维软骨(TFCC)损伤会自己好吗?症状、治疗、康复全解析
酱牛肉最忌三种调料,别再乱加调料了!
日本房地产崩盘后的三十年:经济衰退下的生存法则
灵吉菩萨:《西游记》中的超级助攻
《甄嬛传》里的陆贵妃:从默默无闻到贵妃之位
深圳3-5年级学生将享“每周半天计划”:校外实践与阅读并重
元旦穿搭指南:十二生肖财运提升秘籍
风寒感冒颗粒:11味中药缓解秋冬感冒症状,使用指南来了
Omega-3脂肪酸助力干眼症治疗,专家推荐每周食用两次鲑鱼
秋冬养生,掌握中药正确使用技巧
小刘教你和平精英四指键位设置
孕妇铁蛋白偏高警惕心血管疾病,医生建议这样做
最新研究:短期戒烟可显著改善心理健康
从一张榜单 洞悉重庆餐饮之变
日出摄影技巧全攻略:从设备准备到后期处理
王者荣耀典韦攻略:S10赛季纯肉出装及铭文搭配
揭秘面部特征遗传:从基因到应用
最新英国探亲签证费用标准及附加开销详解
叉车在工业领域的应用与日常维护保养指南