二叉树前序、中序和后序遍历的非递归实现
创作时间:
作者:
@小白创作中心
二叉树前序、中序和后序遍历的非递归实现
引用
1
来源
1.
http://www.cdweb.net/article/piiops.html
二叉树的遍历是数据结构中的一个重要概念,常见的遍历方式包括前序遍历、中序遍历和后序遍历。虽然递归实现是最直观的方式,但在某些场景下,非递归实现可能更为高效。本文将详细介绍二叉树前序、中序和后序遍历的非递归实现方法。
前序遍历(非递归实现)
前序遍历的顺序是根左右,当根节点不为空时,该节点才可以被打印。递归方法会自动保存现场信息,而非递归实现则需要使用栈来手动保存这些信息。
伪代码实现
void PreOrderTraverse(BinaryTree root)
{
BinaryTree cur = root;
stack s;
while(null != cur || !s.empty())
{
while(null != cur)
{
print cur.data;
s.push(cur);
cur = cur.left;
}
if(!s.empty()) {
cur = s.top();
s.pop();
cur = cur.right;
}
} //loop end!
}
实现原理
- 第3行的
cur
相当于递归中的现场信息,而第4行声明的栈则用来保存它。 - 第5行的循环条件是结点不为空或者用户栈不空。
- 第7行到第12行的代码主要做的是,如果当前节点不为空,则打印,同时将该结点的信息保存到用户栈中,接着把当前节点改变成它的左子。当左子为空时,循环结束。
- 第13行到第16行的代码做的是取栈顶的现场信息(也就是最后一次保存的现场信息),然后改变当前结点为它的右子。
后序遍历(非递归实现)
后序遍历的顺序是左右根,我们要保证根节点在左孩子和右孩子访问之后才能访问。
实现条件
- P的左孩子和右孩子都为空,则该节点可以被直接访问;
- P有左孩子或右孩子,但左孩子和右孩子都已经被访问过,那么结点P也可以直接访问。
如果不是上面两种条件,那我们将P的右孩子和左孩子依次入栈,这样就可以保证每次取栈顶元素的时候,左孩子在右孩子的前面被访问,左孩子和右孩子都在根节点的前面被访问。
伪代码实现
void PostOrderTraverse(BinaryTree root)
{
if(null == root)
return;
stack s;
s.push(root);
BinaryTree pre = null;
BinaryTree cur;
while(!s.empty())
{
cur = s.top();
if((null == cur.lchild && null == cur.rchild)
|| (null != pre) && (pre == cur.lchild || pre == cur.rchild)) {
print cur.data;
s.pop();
pre = cur;
}
else {
if(null != cur.rchild) {
s.push(cur.rchild);
}
if(null != cur.lchild) {
s.push(cur.lchild);
}
}
} //loop end!
}
总结
通过上述分析,我们可以看到非递归遍历方法虽然在代码实现上相对复杂,但其效率通常高于递归方法。在实际开发中,可以根据具体需求选择合适的遍历方式。
热门推荐
开车玩安全吗?真的能一边开车一边玩手机吗?
婚假和产假的相关规定
婚假和产假能一起休吗
腹泻不再难缠:崇文中方为您保驾护航
数码宝贝最弱究极体排名:从海天使兽到钢铁海龙兽
合租还是整租,如何选择?合租整租应该注意什么?
打破自拍瓶颈!试试这9个让你又酷又不费力的拍照姿势!
饮食文化:全球美食与健康理念
孕妇能吃话梅吗?孕期解馋新选择,这些要点要牢记
股票高抛低吸蕴含着怎样的投资策略?这种策略有哪些风险和机遇?
魔兽世界烹饪技能1-300级升级全攻略
练好“走跑跳投” 让孩子爱上体育
62家寿险公司二季度偿付能力报告透视:盈利出现分化 资本承压者仍不少
肖像权没拍到脸算侵权吗?律师解释界线与法律责任
白洋淀:自然之美与文化之韵的交融
如何更新WordPress版本来增强网站安全性
揭秘苹果迷狂热背后的心理动机
格力地产子公司珠海保联拟转让所持科华生物5%股份 科华生物第一大股东或将生变
《孙子兵法》与现代管理的奇妙融合
专题地图中专题要素的表示法
游戏+学习,多邻国凭什么“硬控”一亿人?
长沙雨花区2024年征地情况公布!涉拆面积5663亩!
回南天现象解析:南方的湿冷挑战与网友的趣味评论
陕西府谷:探寻家乡的独特魅力
和别人一起开店的合同:合伙人协议的核心要素与法律风险分析
保密协议在商业合作中如何应用
古代科举制度的等级划分
葛均波院士团队获国家发明专利授权:冠脉介入手术实时导航技术实现精准治疗
基于网络药理学探讨人参治疗阿尔茨海默病的作用
KDJ是什么意思?KDJ指标在投资决策中有哪些应用和限制?