栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

思路:以中序遍历(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;   //处理右结点

}

}

}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/917424.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号