二叉树的四种遍历方法详解:递归与迭代实现
创作时间:
作者:
@小白创作中心
二叉树的四种遍历方法详解:递归与迭代实现
引用
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;
}
}
}
热门推荐
直播间里的网络赌博陷阱:上海嘉定法院审结一起开设赌场案
炒股是依据基本面,还是技术面和感觉选股?很实用,建议读10遍
3·15晚会曝光阜阳企业用“槽头肉”生产预制菜,监管部门将开展专项整治
《红楼梦》中的幽默:轻松与深思的完美融合
派对之王的幽默秘诀:四种实用技巧让你成为全场焦点
双11客户服务秘籍:适度催促的艺术
双十一客服秘籍:适度催促赢好评
执子之手,白头偕老:古诗词里的八种爱情观
撸猫“撸”走了我1500块,原来被猫抓伤后的第1件事应该是这个
探访川沙古镇:浦东历史文化之根的千年传奇
冬日酸辣藕片:酥脆开胃的养生美味,从选材到调味全攻略
秋季养生必做:酸辣藕片制作技巧与营养价值全解
夜市饮酒小心变胖!酒精热量揭秘
自由泳燃脂效果更佳,但蛙泳更适合新手
物业专项维修资金从哪来?没有了怎么办?
百会穴配四神聪,中医治疗失眠的实用方案
银婚25年:从传统到现代的变迁
银婚纪念:25年爱情的浪漫庆祝方式
杭州至南宁高铁全程11小时30分钟,途经南京武汉等20城
西双版纳原始森林公园:热带雨林与孔雀放飞的生态盛宴
冬日西双版纳:热带雨林、孔雀放飞与泼水节全攻略
香樟木药用价值揭秘:镇痛祛湿新宠儿
阳产土楼:皖南深山里的独特土楼群,远离商业化的宁静古村
“长寿秘诀”:重要的其实不是多运动、喝水,而是这4点
秋冬吃黑豆:6款养生食谱助力健康过冬
日本签证重大调整:5月20日起多地取消经济证明
黄土高原上的古人类遗址,揭秘人类文明的起源
《口袋妖怪绿宝石386完全探索指南:详述全精灵分布地点与进化路径》
问界M7事故发酵:AEB系统成最大争议点
高超声速导弹防御:美国加速布局天基预警与智能系统