唯一的确定一棵二叉树

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

}

➢创建二叉树函数

相关文档
最新文档