程序二叉树遍历.docx

上传人:b****6 文档编号:3109865 上传时间:2022-11-17 格式:DOCX 页数:7 大小:39.29KB
下载 相关 举报
程序二叉树遍历.docx_第1页
第1页 / 共7页
程序二叉树遍历.docx_第2页
第2页 / 共7页
程序二叉树遍历.docx_第3页
第3页 / 共7页
程序二叉树遍历.docx_第4页
第4页 / 共7页
程序二叉树遍历.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

程序二叉树遍历.docx

《程序二叉树遍历.docx》由会员分享,可在线阅读,更多相关《程序二叉树遍历.docx(7页珍藏版)》请在冰豆网上搜索。

程序二叉树遍历.docx

程序二叉树遍历

实验名称:

二叉树的遍历

(1)实验目的:

1.了解二叉树的基本概念、存储结构以及遍历方式;

2.了解图的基本概念、存储结构以及关键路径的寻找方式;

3.学会使用C++构造一基本的二叉树结构;

4.掌握二叉树的遍历,并使用C++完成其中序遍历,其它遍历方式可类似编写。

(二)实验分析:

二叉树是递归定义的,因而在VB中可以依托数组很容易实现二叉树的建立及先序遍历、中序遍历、后序遍历。

首先自然是要建立一个二叉树,通过对数组赋值,建立一个简单的二叉树。

然后通过使用dowhile循环语句、if....then..条件语句、辅助数组等实现先序遍历、中序遍历和后序遍历等操作。

在此过程中需对数组进行多次赋值和判断,主要依据的是三种遍历中各结点之间的关系。

(3)实验步骤:

1、打开VB语言编程软件,调试好界面,做好准备工作。

2、编程:

PrivateSubForm_Load()

Show

Dimb()

Dimv()'存储二叉树个节点数值

Dimv1()'存储遍历后二叉树各节点的数值

Dimp()AsBoolean'存储该节点是否已被读取

Dimt%'记录以读取节点个数

n=Val(InputBox("请输入数组元素的个数"))

ReDimv(n)

ReDimv1(n)

ReDimp(2*n)

Print

'数组的生成

Print"生成数组"

Fori=1Ton

v(i)=InputBox("请给第"&i&"个元素赋值")

Printv(i);Spc(3);

Nexti

Print

'先序遍历

Print"先序遍历"

i=1

t=0

DoWhilet

'读取第i个节点的数值

t=t+1

ReDimPreserveb(t)

b(t)=v(i)

Ift>=nThenExitDo'全部读完后结束

If2*i+1<=nThen'左右结点均有且未被读取

i=2*i'转到左结点

ElseIf2*i<=nThen'只有左结节点而没有右结点

'读取左结点数值

t=t+1

ReDimPreserveb(t)

b(t)=v(2*i)

DoWhileiMod2<>0'判断该节点属性即该结点是他双亲节点的左孩子还是右孩子

i=(i-1)/2'是双亲节点的右孩子则回到他的双亲节点

Loop

i=i+1'是双亲结点的左孩子则转到他的兄弟结点

Else'该节点为叶子节点

DoWhileiMod2<>0'判断该节点属性即该结点是他双亲节点的左孩子还是右孩子

i=(i-1)/2'是双亲节点的右孩子则回到他的双亲节点

Loop

i=i+1'是双亲结点的左孩子则转到他的兄弟结点

EndIf

Loop'回到当前节点

'输出

Fori=1Ton

Printb(i);Spc(3);

Nexti

Print

'中序遍历

Print"中序遍历"

'给p(i)初始化使各个结点均为被读取(长度为2*n防止下标越界)

Fori=1To2*n

p(i)=False

Nexti

i=1

t=0

DoWhilet

If2*i+1<=nAndp(2*i)=FalseThen'左右结点均有且未被读取

i=2*i'转到左结点

ElseIf2*i<=nAndp(2*i)=FalseThen'只有左结节点而没有右结点且左节点未被读取

'读取左结点数值

t=t+1

ReDimPreserveb(t)

b(t)=v(2*i)

p(2*i)=True'设置该结点已读

'读取结点数值

t=t+1

ReDimPreserveb(t)

b(t)=v(i)'设置该结点已读

p(i)=True

IfiMod2=0Then'是双亲结点的左孩子

'读取该节点的左孩子节点数值

t=t+1

ReDimPreserveb(t)

b(t)=v(i/2)

p(i/2)=True

i=i+1'转到右孩子节点

Else'是双亲结点的右孩子

i=(i-1)/2'转到该节点的双亲节点

EndIf

Else'该节点为根节点或孩子节点全部已读取

Ifp(i)=FalseThen'判断该节点是否以读取

'未读取则读取该节点

t=t+1

ReDimPreserveb(t)

b(t)=v(i)

p(i)=True

EndIf

IfiMod2=0Then'该节点是双亲结点的左孩子

'读取该节点的左孩子节点

t=t+1

ReDimPreserveb(t)

b(t)=v(i/2)

p(i/2)=True

i=i+1'转到该节点的兄弟结点即他的双亲节点的右孩子节点

Else'该节点是双亲结点的右孩子

i=(i-1)/2'转到该节点的双亲节点

EndIf

EndIf

Loop

'输出

Fori=1Ton

Printb(i);Spc(3);

Nexti

Print

'后续遍历

Print"后序遍历"

'给p(i)初始化使各个结点均为被读取(长度为2*n防止下标越界)

Fori=1To2*n

p(i)=False

Nexti

i=1

t=0

DoWhilet

If2*i+1<=nAndp(2*i)=FalseThen'左右结点均有且未被读取

i=2*i'转到左结点

ElseIf2*i<=nAndp(2*i)=FalseThen'只有左结节点而没有右结点且左节点未被读取

'读取左结点数值

t=t+1

ReDimPreserveb(t)

b(t)=v(2*i)

p(2*i)=True

'读取该结点数值

t=t+1

ReDimPreserveb(t)

b(t)=v(i)

p(i)=True

IfiMod2=0Then'该节点是双亲结点的左孩子

i=i+1'转到该节点的兄弟结点即他的双亲节点的右孩子节点

Else'该节点是双亲结点的右孩子

i=(i-1)/2'转到该节点的双亲节点

EndIf

Else'该节点为根节点或孩子节点全部已读取

'读取该节点数值

t=t+1

ReDimPreserveb(t)

b(t)=v(i)

p(i)=True

IfiMod2=0Then'该节点是双亲结点的左孩子

i=i+1'转到该节点的兄弟结点即他的双亲节点的右孩子节点

Else'该节点是双亲结点的右孩子

i=(i-1)/2'转到该节点的双亲节点

EndIf

EndIf

Loop

'输出

Fori=1Ton

Printb(i);Spc(3);

Nexti

i=2*i

EndSub

 

如取n=10,然后随意输入一组数,运行结果如下:

 

(四)实验小结:

通过上面的实验结果可知,在VB语言编程软件中可以简单的实现二叉树的建立及先序遍历、中序遍历、后序遍历,但同时我们也因该注意到其在实现过程中的复杂程度,要编写的代码很多,时间上消耗很大。

而且相对于C语言编程软件来说,程序运行时的时间复杂度也很大,这是一大缺点。

但总体上来说,运用VB编程其可读性较强,后续工作简单。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1