二叉树的四种遍历方法详解:递归与迭代实现
创作时间:
作者:
@小白创作中心
二叉树的四种遍历方法详解:递归与迭代实现
引用
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;
}
}
}
热门推荐
如何申领失业保险金,看看扬中怎么说?
《红楼梦》作者 "曹雪芹" 身份考辨
劳动保护与安全生产知识培训:提升员工安全意识和技能
ChatGPT 高阶用户入门指南
为什么我们会忘记事?这是记忆力下降的征兆吗?
益生菌常见问题解答:如何正确食用并避免过量?
银行的信用卡最低还款和全额还款的利息计算方式有何不同?
温室气体排放与减排政策
云南教改新规:课间延长至15分钟、取消统一晚自习...
昼夜节律长期紊乱可能诱发代谢性疾病和健康风险增加
虚拟机如何扩硬盘
如何为CentOS虚拟机扩展存储空间?
工业润滑油的提炼与制作工艺详解
个人所得税APP租房合同日期的法律解读与实务操作指南
女命八字中的子卯刑:如何解读与应对
电销公司法律培训:提升企业法律意识,保障业务合规进行
唐朝服饰你还只知道齐胸襦裙?这些服饰也是唐朝的!快来长知识
全面指南:上火牙痛适用的8款去火茶饮及缓解方法
经期能吃甜酒吗?专家解析经期饮食注意事项
爆火!蔬菜汁走进各大奶茶店,真的更健康吗?
辣椒蟹:一种来自亚洲河口的迷你蟹类
揭秘健康长寿的14个日常小习惯,建议速速收藏!
为何买车时 “小轮毂” 优于 “大轮毂”?内行人揭秘:四大原因
净土法门法师:念一佛就是念一切佛
低保户住院国家有什么相关待遇
中考数学相交线与平行线复习知识点
早产宝宝发黄疸更危险吗?
生活目标是什么?如何设定并实现你的生活目标?
社交媒体隐私与风险防范
上海灵活就业人员可以参保吗?