数据结构与算法-二叉树遍历的非递归实现

本文介绍了二叉树的非递归遍历方法,特别是中序遍历的实现。通过使用栈来辅助遍历,避免了递归带来的效率问题。算法流程包括将所有左结点入栈,当栈不为空且指针为空时,出栈并访问结点,然后处理右结点。这种方法有效地遍历了二叉树的所有节点。
摘要由CSDN通过智能技术生成

二叉树有三种递归遍历算法:先序、中序和后序三种遍历算法。递归程序虽简洁,但执行效率不高。

下面是二叉树遍历的非递归算法。需要用到栈(特点:后进先出)。

思路:以中序遍历(LDR)为例,先设置一个指针p指向当前需要处理的结点,首先指向根结点,同时设置一个保存指针指向的数据的顺序栈,初态为空栈。开始扫描(并非访问)根结点及其作孩子结点(后面简称左结点),若左结点存在,则将该根结点及其所有左结点入栈,当无左结点时,表示栈顶结点无左孩子,然后栈顶结点出栈,并访问它,接着沿该结点的右子树向下遍历。该过程重复,直到栈空且p为空指针时停止。

算法:

void InOrderNRe(BTNode *b) //一个二叉树b

{

BTNode *St[MaxSize], *p;  //建立一个指针和空栈

int top=-1;

p=b;          //指针p指向树的根结点

while(top>-1‖p!=NULL)  //栈不为空或指针p不为空指针

{

while(p!=NULL)  //扫描p指向的所有左结点

{

top++;    //入栈

St[top]=p;   //p指向的元素入栈

p=p->lchild;   //入栈后,指针指向该结点的左结点

}

if(top>-1) //p为空指针,但栈不为空时,则先出栈,再处理右结点

{

p=St[top];   //出栈,p指针指向出栈的元素(根结点),为访问根结点和处理右结点而准备

top--;

visite(p);  //访问根结点

p=p->rchild;   //处理右结点

}

}

}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值