二叉树排序算法

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

}

/*-------------------------------------非递归部分----------------------------------------*/

相关文档
最新文档