唯一的确定一棵二叉树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》课程设计唯一的确定一棵二叉树
⏹指导教师:
⏹设计人:
⏹班级:
⏹学号:
设计时间:2011年4月18
实习二树、图及其应用
题目:唯一的确定一棵二叉树实习时间:2011.4.15
一、需求分析:
1.如果给出了遍历二叉树的前序序列和中序序列,则可以构造出唯一的一棵二叉树。试编写实现上述功能的程序。已知一棵二叉树的前序和中序序列,设计完成下列任务的一个算法:
(1)构造一棵二叉树;
(2)证明构造正确(即分别以前序和中序遍历该树,将得到的结果与给出的序列进行比较)。
2.测试数据:前序序列为ABDEGCFHIJ,中序序列为DBGEAHFIJC。
二、设计:
⏹设计思想
(1)存储结构:二叉树,用两个一维数组A和B分别存放前序和中序序列。(2)主要算法基本思想:
①将前序和中序序列分别读入数组A和B。
②根据定义,前序序列中第一个元素一定是树根,在中序序列中该元素之前
的所有元素一定在左子树中,其余元素则在右子树中。所以,首先从数组A中取出第一个元素A[0]作根结点,然后在数组B中找到A[0],以它为界,在其前面的是左子树中序序列,在其后面的是右子树中序序列。
③若左子树不为空,沿前序序列向后移动,找到左子树根结点,转②。
④左子树构造完毕后,若右子树不为空,沿前序序列向后移动,找到右子树
根结点,转②。
⑤前序序列中各元素取完则二叉树构造完毕。
⑥对二叉树进行前序和中序遍历,并将结果分别与数组A和B进行比较,若
相同,则证明二叉树构造正确。
⏹设计表示
(1)函数调用关系图:
main → Initiate
CreateTree
PrintBiTree
PreOrder → Visit
InOrder → Visit
PostOrder
(2)函数接口规格说明:
void Initiate(BiTNode **root)//初始化二叉树的头结点
void Visit(char item)//访问操作
void PreOrder(BiTNode *T,void Visit(char item))//前序遍历二叉树
void InOrder(BiTNode *T,void Visit(char item))//中序遍历二叉树
void PostOrder(BiTNode *T,void Visit(char item))//后序遍历二叉树
void PrintBiTree(BiTNode *T,int n)//显示二叉树
void CreateTree(BiTNode *T,int pre_f,int pre_l,int in_f,int in_l,char pre[],char in[])//按要求创建二叉树
⏹实现注释
(1)根据前序遍历和后序遍历创建二叉树,并后序遍历该二叉树。
(2)二叉树逆转90度来显示。
⏹详细设计
总体来说,本程序设计相对比较简单,主要包括七个功能模块:初始化函数、前序遍历二叉树函数、中序遍历二叉树函数、后序遍历二叉树函数、显示函数、创建二叉树函数、主函数。
下面分别给予介绍:
➢初始化函数
void Initiate(BiTNode **root)
{
*root=(BiTNode *)malloc(sizeof(BiTNode));
(*root)->LeftChild=NULL;
(*root)->RightChild=NULL;
}
➢前序遍历二叉树函数
void PreOrder(BiTNode *T,void Visit(char item))
{
if(T!=NULL)
{
Visit(T->data);
PreOrder(T->LeftChild,Visit);
PreOrder(T->RightChild,Visit);
}
}
➢中序遍历二叉树函数
void InOrder(BiTNode *T,void Visit(char item)) {
if(T!=NULL)
{
InOrder(T->LeftChild,Visit);
Visit(T->data);
InOrder(T->RightChild,Visit);
}
}
➢后序遍历二叉树函数
void PostOrder(BiTNode *T,void Visit(char item)) {
if(T!=NULL)
{
PostOrder(T->LeftChild,Visit);
PostOrder(T->RightChild,Visit);
Visit(T->data);
}
}
➢显示函数
void PrintBiTree(BiTNode *T,int n)
{
int i;
if(T==NULL) return;
PrintBiTree(T->RightChild,n+1);
for(i=0;i if(n>=0) { printf("_________________↗"); printf("%c\n\n",T->data); } PrintBiTree(T->LeftChild,n+1); } ➢创建二叉树函数