数据结构课程设计二叉树的遍历.docx

上传人:b****5 文档编号:6542150 上传时间:2023-01-07 格式:DOCX 页数:16 大小:19.76KB
下载 相关 举报
数据结构课程设计二叉树的遍历.docx_第1页
第1页 / 共16页
数据结构课程设计二叉树的遍历.docx_第2页
第2页 / 共16页
数据结构课程设计二叉树的遍历.docx_第3页
第3页 / 共16页
数据结构课程设计二叉树的遍历.docx_第4页
第4页 / 共16页
数据结构课程设计二叉树的遍历.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

数据结构课程设计二叉树的遍历.docx

《数据结构课程设计二叉树的遍历.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计二叉树的遍历.docx(16页珍藏版)》请在冰豆网上搜索。

数据结构课程设计二叉树的遍历.docx

数据结构课程设计二叉树的遍历

 

摘要

 

针对现实世界中许多关系复杂的数据,如人类社会的家谱,各种社会组织机构,博弈交通等复杂事物或过程以及客观世界中广泛存在的具有分支关系或层次

特性的对象.如操作系统的文件构成、人工智能和算法分析的模型表示以及数据库系统的信息组织形式等,用线性结构难以把其中的逻辑关系表达出来,必须借助于数和图这样的非线性结构,因此在以模拟客观世界问题,解决客观世界问题为主要任务的计算机领域中树型结构是信息的一种重要组织形式,树有着广泛应用。

在树型结构的应用中又以二叉树最为常用。

二叉树是一种非常重要的非线性结构,所描述的数据有明显的层次关系,其中的每个元素只有一个前驱,二叉树是最为常用的数据结构,它的实际应用非常广泛,二叉树的遍历方式有三种,前序遍历,中序遍历,后序遍历,先序遍历的

顺序为:

NLR先根结点,然后左子树,右子树;中序遍历顺序为;LNR先左子树,然后根结点,右子树;后序遍历顺序为:

LRN先左子树,然后右子树,根结点。

由前序和中序遍历,有中序和后序遍历序列可以唯一确定一棵二叉树。

对于给几个数据的排序或在已知的几个数据中进行查找,二叉树均能提供一种十分有效的方法,比如在查找问题上,任何借助于比较法查找长度为Ⅳ的一个序表的算法,

都可以表示成一株二叉树。

反之,任何二叉树都对应一个查找有序表的有效方法根据树的数学理论,对于算法分析的某些最有启发性的应用,是与给出用于计算各种类型中不同树的数目的公式有关的。

本文对二叉树以及二叉树的各种功能做介绍以及写出一些基本的程序,让我们对二叉树的理解有更好的效果。

 

关键词:

二叉树的遍历;左子树;右子树;递归

 

I

 

1.问题概述3

1.1问题描述3

1.2需求分析3

1.3设计内容和要求4

1.4流程图及结构图4

2.概要设计5

2.1数据结构设计:

5

2.2源程序代码7

3.调试分析13

3.1调试中的问题13

4.测试结果14

总结17

参考文献18

 

II

 

1.问题概述

 

1.1问题描述

 

创建二叉树并遍历基本要求:

该程序集成了如下功能:

(1)二叉树的建立

(2)递归和非递归先序,中序和后序遍历二叉树

(3)按层次遍历二叉树

(4)交换二叉树的左右子树

(5)输出叶子结点

(6)递归和非递归计算叶子结点的数目

 

1.2需求分析

 

分先序遍历,中序遍历和后序遍历三种情况考虑。

1.先序遍历,当二叉树非空时按以下顺序遍历,否则结束操作:

①访问根结点;

②按先序遍历规则遍历左子树;

③按先序遍历规则遍历右子树;

2.中序遍历,当二叉树非空时按以下顺序遍历,否则结束操作:

①按中序遍历规则遍历左子树;

②访问根结点;

③按中序遍历规3遍历右子树。

3.后序遍历,当二叉树非空时按以下顺序遍历,否则结束操作:

①按后序遍历规则遍历左子树;

②按后序遍历规则遍历右子树;

③访问根结点。

 

3

 

1.3设计内容和要求

 

对任意给定的二叉树(顶点数自定)建立它的二叉链表存贮结构,并利用栈

的五种基本运算(清空堆栈、压栈、弹出、取栈顶元素、判栈空)实现二叉树的

先序、中序、后序三种周游,输出三种周游的结果。

 

1.4流程图及结构图

 

开始

 

i=0

NO

 

YESi

 

btreetypenewNodeNO

 

是否为空YES

 

root=newNodeMultiplex

 

i++

 

returnroot

 

结束

 

图1.1流程图

 

4

 

a

 

bc

 

def

 

图1.2二叉链表存储结构模拟图

 

2.概要设计

 

2.1数据结构设计:

 

1.二叉树结点数据类型定义为:

templatestructBiNode

{

BiNode*rchild,*lchild;//指向左孩子的指针

Tdata;//结点数据信息};

2.二叉树数据类型定义为:

templateclassBiTree{

template

friendostream&operator<<(ostream&os,BiTree&bt);pub

lic:

BiTree();//无参构造函数

BiTree(intm){};//有参空构造函数

BiTree(Tary[],intnum,Tnone);//有参构造函数

 

5

 

BiTree();//

析构函数

void

preorder();//

递归前序遍历

void

inorder();//

递归中序遍历

void

postorder();//

递归后续遍历

void

levelorder();//

层序遍历

int

count();//计算二叉树的结点数

void

display(ostream

&os);//打印二叉树,有层次

void

LevelNum();//

计算每一层结点数

void

PreOrder();//

非递归前序遍历

void

PostOrder();//

非递归后序遍历

void

creat();//

创建二叉树

protected:

//以下函数供上面函数调用//对应相同功能

Voidcreat(BiNode*&root);//

创建

void

release(BiNode*

&root);//

删除

BiNode

*

Build(T

ary[],int

num,Tnone,int

idx);//

用数组创建

二叉树

void

PreOrder(BiNode*

root);//

前序遍历

void

PostOrder(BiNode*

root);//

后续遍历

void

LevelNum(BiNode*

root);//

层序遍历

void

preorder(BiNode*

root);//

递归前序遍历

void

inorder(BiNode*

root);//

递归中序遍历

void

postorder(BiNode*

root);//

递归后续遍历

void

levelorder(BiNode*root);//

层序遍历

int

count(BiNode*

root);//计算结点数

void

display(ostream&

os,BiNode*root,int

dep);//

打印

static

bool

leastCommanAncestor(BiNode

*root,

T

va,Tvb,

BiNode

private:

BiNode

*rootptr;

};

 

6

 

2.2源程序代码

 

#include

usingnamespacestd;

//********************************************************************

*****************

//二叉树结点类的定义

template

structBTNode

{

Tdata;

BTNode*Lchild,*Rchild;

BTNode(TnodeValue=T(),BTNode*leftNode=NULL,BTNode*

rightNode=NULL)

:

data(nodeValue),Lchild(leftNode),Rchild(rightNode){}//可选择参

数的默认构造函数

};

//********************************************************************

******************

//二叉树的建立

template

voidcreateBinTree(BTNode*&root)

{

BTNode*p=root;

BTNode*k;

TnodeValue;

cin>>nodeValue;

if(nodeValue==-1)

{

root=NULL;

7

 

}

else

{

root=newBTNode();

root->data=nodeValue;

createBinTree(root->Lchild);

createBinTree(root->Rchild);

}

}

//********************************************************************

****************

//二叉树的先序遍历

template

voidpreOrder(BTNode*&p)

{

if(p)

{

cout<data<<"";

preOrder(p->Lchild);

preOrder(p->Rchild);

}

}

//********************************************************************

******************

//二叉树的中序遍历

template

voidinOrder(BTNode*&p)

{

 

if(p)

{

 

8

 

inOrder(p->Lchild);

cout<data<<"";

inOrder(p->Rchild);

}

}

//********************************************************************

******************

//二叉树的后序遍历

template

voidlevelOrder(BTNode*&p)

{

if(p)

{

levelOrder(p->Lchild);

levelOrder(p->Rchild);

cout<data<<"";

}

}

//********************************************************************

*****************

//统计二叉树中结点的个数

template

intcountNode(BTNode*&p)

{

if(p==NULL)return0;

return1+countNode(p->Lchild)+countNode(p->Rchild);

}

//********************************************************************

***************

//求二叉树的深度

template

 

9

 

intdepth(BTNode*&p)

{

if(p==NULL)

return-1;

inth1=depth(p->Lchild);

inth2=depth(p->Rchild);

if(h1>h2)return(h1+1);

returnh2+1;

}

//********************************************************************

***************

//二叉树的消毁操作

template

BTNode*destroy(BTNode*p)//消毁函数,用

来消毁二叉树中的各个结点

{

if(p)

{

returndestroy(p->Lchild);

returndestroy(p->Rchild);

deletep;

}

}

//********************************************************************

************

//主函数的设计

intmain()

{

BTNode*rootNode=NULL;

intchoiced=0;

while(true)

 

10

 

{

system("cls");

cout<<"\n\n\n

---主界面---\n\n\n";

cout<<"

1、创建二叉树

2、先序遍历二叉树\n";

cout<<"

3、中序遍历二叉树

4、后序遍历二叉树\n";

cout<<"

5、统计结点总数

6、查看树深度\n";

cout<<"

7、消毁二叉树

0、退出\n\n";

cout<<"

请选择操作:

";

cin>>choiced;

if(choiced==0)

return0;

elseif(choiced==1)

{

system("cls");

cout<<"请输入每个结点,回车确认,并以-1结束:

\n";createBinTree(rootNode);

}

elseif(choiced==2)

{

system("cls");

cout<<"先序遍历二叉树结果:

\n";

preOrder(rootNode);

cout<

system("pause");

}

elseif(choiced==3)

{

system("cls");

cout<<"中序遍历二叉树结果:

\n";

inOrder(rootNode);

cout<

 

11

 

system("pause");

}

elseif(choiced==4)

{

system("cls");

cout<<"后序遍历二叉树结果:

\n";

levelOrder(rootNode);

cout<

system("pause");

}

elseif(choiced==5)

{

system("cls");

intcount=countNode(rootNode);

cout<<"二叉树中结点总数为"<

system("pause");

}

elseif(choiced==6)

{

system("cls");

intdep=depth(rootNode);

cout<<"此二叉树的深度为"<

system("pause");

}

elseif(choiced==7)

{

system("cls");

cout<<"二叉树已被消毁!

\n";

destroy(rootNode);

cout<

system("pause");

 

12

 

}

else

{

system("cls");

cout<<"\n\n\n\n\n\t错误选择!

\n";

}

}

}

 

3.调试分析

 

3.1调试中的问题

 

创建二叉树:

依次输入二叉树前序遍历序列,构建相应的二叉树。

二叉树遍历:

递归算法、非递归算法测试,调用相应函数进行测试,结果正

确。

求二叉树深度和结点数:

创建一个二叉树,调用相关函数,测试结果正确。

算每层结点数:

调用levelNum()函数,测试结果正确。

调试时遇到诸多问题,其中最主要的问题是死循环问题,在非递归遍历时,

容易进入死循环,经过查找资料、分步调试最终找到循环结束条件,顺利解决各

个难题。

 

13

 

4.测试结果

 

(1)初始界面:

主界面所包含的内容

 

图4.1初始界面图

 

(2)运行结果:

进行操作1,输入每个结点,显示结果如下

 

图4.2创建二叉树

14

 

进行操作2,执行结果如下:

 

图4.3二叉树先序遍历

进行操作3,执行结果如下:

 

图4.4二叉树中序遍历

进行操作4,执行结果如下:

 

15

 

图4.5二叉树后序遍历:

进行操作5,执行结果如下:

 

图4.6统计二叉树节点

 

进行操作6,执行结果如下:

 

图4.7查看树深度

16

 

总结

 

要能很好的掌握编程,仅仅通过几个简单的程序的编写时无法达成的,更需要大量积累和深入才可能通过本次课程设计。

有关一个课题的所有知识不仅仅是在课本上,多查阅一些资料能够更好的完成课题,这就需要一种能力,即自学能力。

本次课程设计还让我认识到自己的缺点。

本次选的课题是二叉树的遍历,因为本学期所学的就是二叉树等数据结构,所以认为比较适合。

刚开始认为会很简单,但到后来就出现一些难以解决的问题,就像老师请教,并查阅相关资料。

经过慢慢的调试,最终测试成功。

这次课程设计让我所学到的数据结构知识发挥的淋漓尽致,而且还拓展了我的知识面,使我更加熟练的掌握各种方法。

总之,这次课程设计增强了我的自学能力,拓展了我的知识面,让我对数据结构更加了解。

 

17

 

参考文献

 

[1]严蔚敏吴伟民《数据结构(C语言版)》清华大学出版社,

2009年9月

 

[2]谭浩强《C程序设计(第三版)》清华大学出版社2009年1月

 

18

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

当前位置:首页 > 医药卫生

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

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