二叉树的建立-课程设计-数据结构

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二叉树

一.需求设计:

建立二叉树,层序、先序遍历(用递归或非递归的方法都可以)任务:要求能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列;分别建立建立二叉树存储结构的的输入函数、输出层序遍历序列的函数、输出先序遍历序列的函数。

二.概要设计:

存储结构:

采用了链表的存储方式,属于链接存储结构。

以下是用于存储结点的结构体的定义:

typedef int datatype ;

struct node{

datatype data;

node *llink,*rlink;

};

基本算法:

这个算法的主要包括了对二叉树的遍历算法,其中包括了先序遍历和层次遍历。

在我的程序中用递归的方法实现了先序遍历,用非递归的方法实现了层次遍历。

其中在程序的开始还要建立二叉树,算法如下:

//创建

void creat(pointer& t,

datatype x,pointer lp,pointer rp)

{

t=new node;

t->data=x;

t->llink=lp; t->rlink=rp;

}

在main()方法中调用这个方法来创建二叉树:

//创建二叉树

creat(p1,6,NULL,NULL);

creat(p2,7,NULL,NULL);

creat(p3,5,p1,p2);

creat(p1,4,NULL,NULL);

creat(p2,2,p1,p3);

creat(p3,3,NULL,NULL);

creat(root,1,p2,p3);

1

2 3

4 5

6 7

其中2,3是1的孩子,4,5是2的孩子,6,7是5的孩子

先序遍历算法如下:

//遍历

//前序遍历

void preorder(pointer p)

{

if(p)

{

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

preorder(p->llink);

preorder(p->rlink);

}

};

采用递归的方法,访问根结点——>先序遍历根的左子树——>先序遍历根的右子树

层次遍历采用非递归的算法,如下:

//层次遍历

void levelorder(pointer root)

{

//层次遍历需要利用队列

pointer Q[8];//队列需要的长度至少为元素个数+1,太小了则会溢出

int f,r;//队首和队尾指针

f=1;r=1;

pointer p=root;

if(p) Q[r++]=p;

while(f!=r)

{

p=Q[f++];//读取队首元素,删除队首元素

printf("%d ",p->data);//访问根结点

if(p->llink)//左孩子进入队列

Q[r++]=p->llink;

if(p->rlink)//右孩子进入队列

Q[r++]=p->rlink;

}

}

三.详细设计:

源程序:

//二叉树

#include

typedef int datatype ;

struct node{

datatype data;

node *llink,*rlink;

};

typedef node *pointer;

//创建

void creat(pointer& t,

datatype x,pointer lp,pointer rp)

{

t=new node;

t->data=x;

t->llink=lp; t->rlink=rp;

}

//遍历

//前序遍历

void preorder(pointer p)

{

if(p)

{

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

preorder(p->llink);

preorder(p->rlink);

}

};

//层次遍历

void levelorder(pointer root)

{

//层次遍历需要利用队列

pointer Q[8];//队列需要的长度至少为元素个数+1,太小了则会溢出int f,r;//队首和队尾指针

f=1;r=1;

pointer p=root;

if(p) Q[r++]=p;

while(f!=r)

{

p=Q[f++];//读取队首元素,删除队首元素

printf("%d ",p->data);//访问根结点

if(p->llink)//左孩子进入队列

Q[r++]=p->llink;

if(p->rlink)//右孩子进入队列

Q[r++]=p->rlink;

}

}

void main()

{

pointer p1,p2,p3;

pointer root;

//创建二叉树

creat(p1,6,NULL,NULL);

creat(p2,7,NULL,NULL);

creat(p3,5,p1,p2);

creat(p1,4,NULL,NULL);

creat(p2,2,p1,p3);

creat(p3,3,NULL,NULL);

creat(root,1,p2,p3);

printf("\n 前序:");

preorder(root);

printf("\n 层次:");

levelorder(root);

printf("\n");

}

四.调试分析:

测试数据和结果:

调试得到输出结果如图:

当建立二叉树:

1

2 3

4 5

6 7

其中2,3是1的孩子,4,5是2的孩子,6,7是5的孩子时得到的遍历结果:

相关文档
最新文档