二叉树遍历课程设计心得模版.docx

上传人:b****7 文档编号:16538640 上传时间:2023-07-14 格式:DOCX 页数:14 大小:49.23KB
下载 相关 举报
二叉树遍历课程设计心得模版.docx_第1页
第1页 / 共14页
二叉树遍历课程设计心得模版.docx_第2页
第2页 / 共14页
二叉树遍历课程设计心得模版.docx_第3页
第3页 / 共14页
二叉树遍历课程设计心得模版.docx_第4页
第4页 / 共14页
二叉树遍历课程设计心得模版.docx_第5页
第5页 / 共14页
二叉树遍历课程设计心得模版.docx_第6页
第6页 / 共14页
二叉树遍历课程设计心得模版.docx_第7页
第7页 / 共14页
二叉树遍历课程设计心得模版.docx_第8页
第8页 / 共14页
二叉树遍历课程设计心得模版.docx_第9页
第9页 / 共14页
二叉树遍历课程设计心得模版.docx_第10页
第10页 / 共14页
二叉树遍历课程设计心得模版.docx_第11页
第11页 / 共14页
二叉树遍历课程设计心得模版.docx_第12页
第12页 / 共14页
二叉树遍历课程设计心得模版.docx_第13页
第13页 / 共14页
二叉树遍历课程设计心得模版.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

二叉树遍历课程设计心得模版.docx

《二叉树遍历课程设计心得模版.docx》由会员分享,可在线阅读,更多相关《二叉树遍历课程设计心得模版.docx(14页珍藏版)》请在冰点文库上搜索。

二叉树遍历课程设计心得模版.docx

二叉树遍历课程设计心得模版

一.选题背景

二叉树的链式存储结构是用指针建立二叉树中结点之间的关系。

二叉链存储结构的每个结点包含三个域,分别是数据域,左孩子指针域,右孩子指针域。

因此每个结点为

由二叉树的定义知可把其遍历设计成递归算法。

共有前序遍历、中序遍历、后序遍历。

可先用这三种遍历输出二叉树的结点。

然而所有递归算法都可以借助堆栈转换成为非递归算法。

以前序遍历为例,它要求首先要访问根节点,然后前序遍历左子树和前序遍历右子树。

特点在于所有未被访问的节点中,最后访问结点的左子树的根结点将最先被访问,这与堆栈的特点相吻合。

因此可借助堆栈实现二叉树的非递归遍历。

将输出结果与递归结果比较来检验正确性。

二.问题描述

对任意给定的二叉树(顶点数自定)建立它的二叉链表存贮结构,并利用栈的五种基本运算(置空栈、进栈、出栈、取栈顶元素、判栈空)实现二叉树的先序、中序、后序三种遍历,输出三种遍历的结果。

画出搜索顺序示意图。

三.概要设计

3.1.创建二叉树

3.2.二叉树的非递归前序遍历示意图

图3.2二叉树前序遍历示意图

3.3.二叉树的非递归中序遍历示意图

图3.3二叉树中序遍历示意图

 

3.4.二叉树的后序非递归遍历示意图

图3.4二叉树后序遍历示意图

四.详细设计

4.1创建二叉树

(1)定义二叉树结点值的类型为字符型。

#definem50

typedefstructNode

{

chardata;

structNode*Lchild;

structNode*Rchild;

}bitnode,*bitree;

typedefstruct

(2)结点个数不超过50个。

(3)按先序次序输入,构造二叉链表表示的二叉树T,空格表示空树。

4.2二叉树的非递归前序遍历算法

voidpreorder(bitreeroot)

{

SeqStackS;bitreep;

InitStack(&S);

p=root;

while(p!

=NULL||!

isempty(&S))

{

while(p!

=NULL)

{

printf("%c",(p->data));

push(&S,p);

p=p->Lchild;

}

if(!

isempty(&S))

{

pop(&S,&p);

p=p->Rchild;

}

}

}

a.访问结点的数据域。

b.指针指向p的左孩子结点。

c.从栈中弹出栈顶元素。

d.指针指向p的右孩子结点。

4.3二叉树的非递归中序遍历算法

voidinorder(bitreeroot)

{

SeqStackS;bitreep;

InitStack(&S);

p=root;

while(p!

=NULL||!

isempty(&S))

{

if(p!

=NULL)

{

push(&S,p);

p=p->Lchild;

}

else

{

pop(&S,&p);

printf("%c",(p->data));

p=p->Rchild;

}

}

}

a.指针指向p的左孩子结点。

b.从栈中弹出栈顶元素。

c.访问结点的数据域。

d.指针指向p的右孩子结点。

4.4二叉树的非递归后序遍历算法

voidpostorder(bitreeroot)

{

SeqStackS;bitreep,q;

InitStack(&S);

p=root;

while(p!

=NULL||!

isempty(&S))

{

if(p!

=NULL)

{

push(&S,p);

p=p->Lchild;

}

else

{

GetTop(&S,&p);

if(p->Rchild==NULL||p->Rchild==q)

{

printf("%c",(p->data));

pop(&S,&p);

q=p;

p=NULL;

}

else

{

p=p->Rchild;

}

}

}

}

root是要遍历树的根指针,后序遍历要求在遍历完左右子树后,再访问根。

需要判断根结点的左右子树是否均遍历过。

也可采用标记法,结点入栈时,配一个标志tag一同入栈

(1:

遍历左子树前的现场保护,2:

遍历右子树前的现场保护)。

首先将bt和tag(为1)入栈,遍历左子树;

返回后,修改栈顶tag为2,遍历右子树;最后访问根结点。

五.测试数据与分析

六.源代码

非递归算法实现:

1.新建一个工程,再在工程中新建一个头文件,输入下列程序:

#definem50

typedefstructNode

{

chardata;

structNode*Lchild;

structNode*Rchild;

}bitnode,*bitree;

typedefstruct

{

bitreestack[m];/*用来存放栈中元素的一维数组*/

inttop;

}SeqStack;

voidInitStack(SeqStack*s)/*初始化栈*/

{

s->top=-1;

}

intisempty(SeqStack*s)/*判断栈是否为空*/

{

if(s->top==-1)

return1;

else

return0;

}

intpush(SeqStack*s,bitreex)/*进栈*/

{

if(s->top==m-1)

return(0);

else

{

s->top++;

s->stack[s->top]=x;

return

(1);

}

}

intpop(SeqStack*s,bitree*x)/*出栈*/

{

if(s->top==-1)

return(0);

else

{

*x=s->stack[s->top];

s->top--;

return

(1);

}

}

intGetTop(SeqStack*s,bitree*x)/*去栈顶元素*/

{

if(s->top==-1)

return0;

else

{

*x=s->stack[s->top];

return1;

}

}

voidpreorder(bitreeroot)/*先序遍历二叉树*/

{

SeqStackS;bitreep;

InitStack(&S);

p=root;

while(p!

=NULL||!

isempty(&S))

{

while(p!

=NULL)

{

printf("%c",(p->data));

push(&S,p);

p=p->Lchild;

}

if(!

isempty(&S))

{

pop(&S,&p);

p=p->Rchild;

}

}

}

voidinorder(bitreeroot)/*中序遍历二叉树*/

{

SeqStackS;bitreep;

InitStack(&S);

p=root;

while(p!

=NULL||!

isempty(&S))

{

if(p!

=NULL)

{

push(&S,p);

p=p->Lchild;

}

else

{

pop(&S,&p);

printf("%c",(p->data));

p=p->Rchild;

}

}

}

voidpostorder(bitreeroot)/*后序遍历二叉树*/

{

SeqStackS;bitreep,q;

InitStack(&S);

p=root;

while(p!

=NULL||!

isempty(&S))

{

if(p!

=NULL)

{

push(&S,p);

p=p->Lchild;

}

else

{

GetTop(&S,&p);

if(p->Rchild==NULL||p->Rchild==q)

{

printf("%c",(p->data));

pop(&S,&p);

q=p;

p=NULL;

}

else

{

p=p->Rchild;

}

}

}

}

2.再在工程中新建一个C++源文件,将它另存为以.c为扩展名的文件,输入下列程序:

#include"stdio.h"

#include"malloc.h"

#include"order.h"

bitreecreatbitree()

{

charch;bitreebt;

ch=getchar();

if(ch=='.')

bt=NULL;

else

{

bt=(bitree)malloc(sizeof(bitnode));

bt->data=ch;

bt->Lchild=creatbitree();

bt->Rchild=creatbitree();

}

returnbt;

}

voidmain()

{

inta;

bitreebt;

printf("请输入二叉树的线序序列,空子树用'.'表示:

\n");

bt=creatbitree();

while(a!

=0)

{printf("需要先序遍历输出请输入1,中序遍历请输入2,后序遍历请输入3,结束输入0:

");

scanf("%d",&a);

switch(a)

{

case

(1):

preorder(bt);break;

case

(2):

inorder(bt);break;

case(3):

postorder(bt);break;

case(0):

break;

}

printf("\n");

}

}

 

总结

1.“数据结构”是计算机类各专业的核心课程,也是其他诸多类专业的重要选修课。

我通过学习这门课,可以为理解、应用和开发程序提供技术和方法支持,为后续课程的学习提供重要思想和方法基础。

同时对于我的逻辑思维培养和程序设计思想体系的建立有着重要的影响。

2.在调试过程中,碰到诸多问题,比如定义表长过小,处理记录数量错误时程序的异常,记录冲突次数等等。

处在不断调试,询问老师,和同学探讨之后,终于解决,运行成功。

参考文献:

【1】耿国华数据结构——C语言描述高等教育出版社

【2】严蔚敏数据结构——C语言描述清华大学出版社

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

当前位置:首页 > 经管营销

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2