二叉树遍历的非递归算法
闲来无事,重看了《数据结构》一书,突然发现其中的很多代码写的很精妙,以下就是我对二叉树一部分的做的记录。一般遍历就是使用前序、中序、后序三种遍历,我自己平时都是使用递归算法,今天看书才发现递归算法不是最优解,因为函数调用栈层层叠加,还要保存函数的返回地址,实际参数传递,创建局部变量等等。
一、二叉树前序非递归算法
前序遍历的特点是:首先访问根,访问完根后再访问左子树,所以对每一个结点,在访问完该结点后,沿着左链访问下来 ,直到为左链为空,然后将所有访问过的结点进栈。然后结点出栈,每一个出栈的结点就是表示该结点和期左子树都已经被访问,那么开始访问该结点的右子树了。
步骤如下:
1.当前指针指向根结点。
2.打印当前结点,当前指针指向其左孩子结点并进栈,重复(2),直至左孩子为Null.
3.依次退栈,将当前指针指向右孩子结点。
4.若栈非空或者当前指针非Null,执行(2),否则结束.
代码如下 c语言版本:
void Bit_PreOder(BitNode *root)
{
BitNode *p, * node[max];
int top=0;p=root;
do
{while (p!=null)
{printf("%d, ",p->data) ; node[top=p] ; top++; p=p->lch ;} /* lch是指左子结点,rch是指右子节点 */
if (top>0)
{ top-- ; p=node[top] ; p=p->rch ; } /* 凡是退栈的指针,其所指的结点及其左子树,都已遍历 */
}while (top>0 || p!=null)
}
二、二叉树中序非递归算法.
中序遍历的特点:先访问左子树,对每一个结点沿着其左链走下来,直到左链为空,所有经过的结点进栈。然后结点出栈,对于每一个出栈的结点,即表示该结点的左子树已访问,然后访问该结点(根),访问完该结点后再访问该结点的右子树。
步骤:
1.当前结点指向根结点.
2.当前结点进栈,当前指针指向其左孩子,重复(2),直至左孩子为null
3.依次退栈,退栈指针成为当前指针,打印当前结点.
4.将当前指针指向右孩子。
5.如栈非空或者当前指针非Null,执行(2),否则结束.
代码如下,C语言版本:
void Bit_MidOder(BitNode *root)
{
BitNode *p, * node[max];
int top=0;p=root;
do
{while (p!=null)
{ node[top=p] ; top++; p=p->lch ;} /* lch是指左子结点,rch是指右子节点 */
if (top>0)
{ top-- ; p=node[top] ; printf( " %d",p->data) ;p=p->rch ; } /* 凡是退栈的指针,其所指的结点及其左子树,都已遍历 */
}while (top>0 || p!=null)
}
* 注意:以上代码已经过测试,可以使用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!