数据结构课程设计__判别给定的二叉树是否为二叉排序树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计任务书
目录
1 需求分析 (3)
2 概要设计 (4)
2.1存储结构设计说明 (4)
2.2程序功能图 (4)
2.3算法流程图 (5)
3 详细设计 (7)
3.1程序分析 (7)
3.2程序源代码 (7)
4 调试分析 (9)
5 课程总结 (11)
6参考文献 (12)
1 需求分析
图1-1 二叉树
以图1-1所示的二叉树为例设计,建立一个以二叉链表方式存储的二叉树,输入结点信息时按照完全二叉树的结点顺序输入(1为虚结点,0为输入结束)。由于一棵二叉排序树中序遍历后的序列是递增有序的,因此可利用中序遍历一棵二叉树后的序列是否递增有序来判断是否为二叉排序树。
如图,二叉树的结点输入顺序为77 80 90 50 1 68 88 1 1 34 56 0 (1为虚结点,0为输入结束),中序遍历之后的顺序为50 80 77 34 68 56 90 88 ,由于中序遍历之后的序列不是递增有序的,因此可判断出此二叉树不是二叉排序树。
2 概要设计
2.1 存储结构设计说明
typedef struct node{
int data; //数据域
node *lchild,*rchild; //左孩子指针,右孩子指针
}Bitree; //结点的结构体定义
2.2程序功能图
图2-1 程序功能图
2.3算法流程图
选取部分核心流程图如下:
图2-2 主要流程图
图2-3 建立二叉树
3 详细设计
3.1程序分析
建立一个以二叉链表方式存储的二叉树,建立二叉树时,按照完全二叉树的结点顺序输入,1表示虚结点,0表示输入结束。若不是虚结点时,则建立一个新结点,并且将其作为左孩子或右孩子结点连接到它的父结点上(第一个结点无父结点);若是虚结点,则将空结点(NULL)作为左孩子或右孩子结点连接到它的父节点上。
判定二叉树时,中序遍历整棵二叉树,访问根结点时将根结点信息存入一个数组中,以用来比较中序遍历后序列是否为空。比较数组元素时,从下标为0的数组元素开始比较,先将下标为i=0的a[i]与下标为1的
a[i+1]比较,如果a[i]>a[i+1],则结束比较,即该二叉树不是二叉排序树,否则继续比较,直至比较完整个数组元素。
3.2程序源代码
#include "stdafx.h" //编写的任何.cpp文件都必须首先包含stdafx.h
#include
#include
#define max 10
typedef struct node{
int data; //数据域
node *lchild,*rchild; //左孩子指针,右孩子指针
}Bitree; //结点的结构体定义
Bitree *B[max];
int temp=0;
int Btree[max];
Bitree *Creatree(){ //建立二叉树
Bitree *T,*S;
int ch;
int front,rear,sign;
sign=0; //结点的序号从0开始编号(按照完全二叉树的顺序标记)
front=0; //双亲结点下标初值
rear=-1; //自身结点下标初值
T=NULL; //初始化树T
printf("建立二叉树(1表示虚结点,0表示输入结束):\n");
scanf("%d",&ch); //按完全二叉树的顺序输入结点
while(ch!=0)
{
if(ch!=1) //输入结点不是虚结点
{
S=(Bitree *)malloc(sizeof(Bitree)); //创建新结点S
S->data=ch; //将输入的数据保存到S中
S->lchild=S->rchild=NULL; //将S的左右子树为空
rear++; //结点下标加1
B[rear]=S; //将S保存到数组B中,即从下标为0开始存储
if(rear==front) //双亲结点下标与本身下标相同时,即无双亲结点(只有第一个结点会产生这种情况)
{
T=S;
sign++; //结点的序号加1
}
else //寻找双亲结点
{
if(sign%2==1)
B[front]->lchild=S; //S作为左孩子
if(sign%2==0)
{
B[front]->rchild=S;//S作为右孩子
front++; //下标加1,即寻找下一个双亲结点
}
sign++;//结点序号加1
}
}
else{ //输入结点为虚结点
if(sign%2==0) //为右子树时
{front++;} //双亲结点加1 即下一个双亲结点
sign++; //结点序号加1
}
scanf("%d",&ch);
}
return T;
}
void Inorder(Bitree *T) //中序遍历二叉树T,并将每个结点数据存入数组中
{
if(T!=NULL) //如果树不为空
{
Inorder(T->lchild);
printf("%d\t",T->data);
Btree[temp]=T->data;
temp++;
Inorder(T->rchild);
}
}
int Judgesort_bitree(int Btree[]) //判断中序遍历后的二叉树是否是二叉排序树{
int i,sign=1;
for(i=0;i { if(Btree[i]>Btree[i+1]) //不是有序递增的 { sign=0; break; } } return sign; } void Judgeout(int a)//判断输出将sign赋给a { if(a==1) printf("给定二叉树是二叉排序树!\n"); if(a==0) printf("给定二叉树不是二叉排序树!\n"); } void main() { Bitree *T; T=Creatree(); //建立二叉树 printf("中序遍历:\n"); Inorder(T); //中序遍历二叉树 printf("\n"); Judgeout(Judgesort_bitree(Btree)); //判断是否为排序二叉树 } 4 调试分析 实现了设计的所有要求,选取部分运行示意图。