二叉树的建立-课程设计-数据结构
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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的孩子时得到的遍历结果: