博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【数据结构周周练】011 非递归算法实现二叉树的遍历
阅读量:4074 次
发布时间:2019-05-25

本文共 1062 字,大约阅读时间需要 3 分钟。

一、前言

从第七篇周周练博客开始就一直在围绕二叉树的创建和遍历在进行分享,因为这是很重要的一部分内容,二叉树怎么用顺序表创建,怎么用链式结构来创建,怎么用递归算法创建,不用递归算法怎么创建。顺序二叉树的遍历,二叉链表的递归遍历等等,这些都是最基础也最重要的东西之一。

本次要给大家分享的是非递归遍历方法,先序和中序的非递归算法比较方便,后续遍历比较麻烦,可以通过孩子结点是否访问,来决定是否访问左右子树,从而防止重复访问。原理同非递归创建二叉树类似,在这里不重复分享代码,有兴趣的,大家可以自己尝试。代码真的只有自己写了,算法自己认真琢磨了,才能慢慢学明白,知识都是一点一点,一次一次磨练出来的

二、题目

将下图用二叉树存入,并通过三种遍历方式对该树进行遍历。其中圆角矩形内为结点数据,旁边数字为结点编号,编号为0的结点为根节点,箭头指向的结点为箭尾的孩子结点。要求遍历每个结点时能够查询当前结点的数据、编号、双亲结点以及孩子结点的编号,如果结点是根节点或者叶子结点,请说明。

 三、代码

1、非递归先序遍历算法

void PreOrderBiTree(BiTree BT) {	LinkStack S = (LinkStack)malloc(sizeof(LNode));	if (!S)	{		cout << "空间分配失败" << endl;		exit(OVERFLOW);	}	S->next = NULL;	BiTree  p = BT;	while (p || S)	{		if (p)		{			Push(S, p);			VisitBiTree(p);			p = p->lChild;		}		else		{			Pop(S, p);			p = p->rChild;		}	}}

2、非递归中序遍历算法

void InOrderBiTree(BiTree BT) {	LinkStack S = (LinkStack)malloc(sizeof(LNode));	if (!S)	{		cout << "空间分配失败" << endl;		exit(OVERFLOW);	}	S->next = NULL;	BiTree  p = BT;	while (p || S)	{		if (p)		{			Push(S, p);			p = p->lChild;		}		else		{			Pop(S, p);			VisitBiTree(p);			p = p->rChild;		}	}}

四、实现效果

你可能感兴趣的文章
网络游戏客户端的日志输出
查看>>
关于按钮的mouseOver和rollOver
查看>>
《多线程服务器的适用场合》例释与答疑
查看>>
Netty框架
查看>>
Socket经验记录
查看>>
对RTMP视频流进行BitmapData.draw()出错的解决办法
查看>>
多年前写的一个ASP.NET网站管理系统,到现在有些公司在用
查看>>
FMS 客户端带宽计算、带宽限制
查看>>
在线视频聊天(客服)系统开发那点事儿
查看>>
语法解析器!
查看>>
SecurityError Error 2148 SWF 不能访问本地资源
查看>>
Flex4的可视化显示对象
查看>>
Flex:自定义滚动条样式/隐藏上下箭头
查看>>
烈焰SWF解密
查看>>
Qt 静态编译后的exe太大, 可以这样压缩.
查看>>
3D游戏常用技巧Normal Mapping (法线贴图)原理解析——基础篇
查看>>
C#的扩展方法解说
查看>>
.linearDrag on rigidbody / rigidbody2D in code?
查看>>
mute
查看>>
Google、微软软件测试之道
查看>>