二叉树的四种遍历方法详解:递归与迭代实现
创作时间:
作者:
@小白创作中心
二叉树的四种遍历方法详解:递归与迭代实现
引用
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个高SEO价值标题:数字、关键词与吸引力的完美结合
网站SEO优化中标题标签的使用方法与影响 - 提升排名的关键策略
买车应该选什么颜色?交警教你一句“口诀”,照着买不会吃亏
买车最好不买白色?原因你知道吗?
英国日期英文怎么写
工伤未认定企业如何补偿?一文详解工伤赔偿问题
买饮料前,请注意这一套标识
安徽东至:延伸农业产业链 拓宽增收致富路
解决荣耀手环与华为手机连接问题的全面指南
新的UEFI安全启动漏洞可能允许攻击者加载恶意Bootkit
自然人独资有限责任公司需要监事吗?
藿香正气水不防暑?夏日养生别掉坑!
互联网+剪纸:传统艺术与现代科技的完美结合
建筑工程的各级验收:如何组织?如何验收?
李耳:道家思想的开创者
老子的名字“李耳”竟然是个谐音梗
日语配音李云龙:从语言特点到文化融合的深度探讨
碧溪苑社区开展环境卫生整治志愿服务活动
元宵节为什么要舞龙灯
骨髓抑制的分级及护理
当归红枣红糖煮鸡蛋经期可以吃吗
如何与父母建立更深层次的沟通:改变看家长的方式,找到真正的沟通方法
寒湿形成的原因
混合动力汽车技术详解:三种分类方式全解析
当BIOS失效时,如何定位并修复主板问题?
你是什么样的人,由他人对你的回应决定