二叉树排序算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
课程名称:数据结构实验课程
实验四、串的基本操作练习
一、实验目的
1. 掌握二叉树的存储实现
2. 掌握二叉树的遍历思想
3. 掌握二叉树的常见算法的程序实现
二、实验环境
VC++6.0
三、实验内容
1.输入字符序列,建立二叉树的二叉链表结构。(可以采用先序序列)
2.实现二叉树的先序、中序、后序的递归遍历算法。
3.实现二叉树的先序、中序、后序的非递归遍历算法。
4.求二叉树的高度。
5.求二叉树的结点个数。
6.求二叉树的叶子结点的个数。
四、实验要求:
分别编写实现上述算法的子函数,并编写一个主函数,在主函数中设计一个简单的菜单,分别调用上述子函数。
五、实验步骤和结果
1.打开vc,新建文本,命名二叉树算法,编写代码。
2.编写代码:
#include
#include
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
int i=0;
/*--------------------------------------建立堆栈------------------------------------------*/
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;//树类型
typedef struct SqStack
{
BiTNode *base;
BiTNode *top;
int stacksize;
} SqStack;//栈类型
void InitStack(SqStack *S)//创建二叉树
{
S->base=(BiTNode*)malloc(STACK_INIT_SIZE*sizeof(BiTNode));
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
}
void Push(SqStack *S,BiTNode e)//进栈
{
if(S->top - S->base >= S->stacksize)//如果栈空间不足
{
S->base=(BiTNode*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(B iTNode));
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;
}
*(S->top)=e;
S->top++;
}
BiTNode Pop(SqStack *S)//出栈
{
S->top --;
return *S->top;
}
int StackEmpty(SqStack *S)//判断栈是否非空
{
if(S->top == S->base )
return 1;
else
return 0;
}
/*---------------------------------------------递归部分-------------------------------------------*/
BiTree Create(BiTree T)//建立二叉树
{
char ch;
ch=getchar();
if(ch=='#')
T=NULL;
else
{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
printf("申请内存空间失败!");
T->data=ch;
T->lchild=Create(T->lchild);
T->rchild=Create(T->rchild);
}
return T;
}
int Sumleaf(BiTree T)//计算叶子节点
{
int sum=0,m,n;
if(T)
{
if((!T->lchild)&&(!T->rchild))
sum++;
m=Sumleaf(T->lchild);
sum+=m;
n=Sumleaf(T->rchild);
sum+=n;
}
return sum;
}
/*int Sumleaf(BiTree T)//老师课堂上的计算叶子数的代码,没有问题{
if(!(T->lchild&&T->rchild))
return 1;
else
return(Sumleaf(T->lchild)+Sumleaf(T->rchild));
}*/
int PreOrder_1(BiTree T)//先序递归
{
if(T)
{
printf("%c",T->data);//根节点
i++;
PreOrder_1(T->lchild);
PreOrder_1(T->rchild);
}
return i;
}
void InOrder_1(BiTree T)//中序递归
{
if(T)
{
InOrder_1(T->lchild);
printf("%c",T->data);//根节点
InOrder_1(T->rchild);
}
}
void PostOrder_1(BiTree T)//后序递归
{
if(T)
{
PostOrder_1(T->lchild);
PostOrder_1(T->rchild);
printf("%c",T->data);//根节点
}
}
int Depth(BiTree T)//计算高度
{
int dep=0,depl,depr;
if(!T)
dep=0;
else
{
depl=Depth(T->lchild);
depr=Depth(T->rchild);
dep=1+(depl>depr?depl:depr);
}
return dep;
}
/*-------------------------------------非递归部分----------------------------------------*/