二叉树的实现及遍历
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三:二叉树的实现及遍历
实验内容:
1) 采用二叉树链表作为存储结构,完成二叉树的建立,
先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。
2) 输出树的深度,最大元,最小元。
实现代码如下:
#include"stdio.h"
#include"stdlib.h"
#define Max 50
typedefstruct Node
{
char data;
struct Node *lchild,*rchild;
}BinTNode;
typedefBinTNode *BiTree;
intNodeNum,BileafNum;/*NodeNum为结点数,leafNum为叶子结点数*/
int max=-100;/*把max定义得足够小,A的ASCII值为065*/
int min=100;/*把min定义得足够大,Z的ASCII值为090*/
BiTreeCreatBiTree()/*创建二叉树*/
{
BiTree T;
charch;
if((ch=getchar())=='#')
return(NULL);
else
{
T=(BinTNode *)malloc(sizeof(BinTNode)); /*生成新结点*/
T->data=ch;
T->lchild=CreatBiTree(); /*构造左子树*/
T->rchild=CreatBiTree(); /*构造右子树*/ return(T);
}
}
void PreOrderTraverse(BiTree T)/*先序遍历*/
{
if(T) {
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
void InOrderTraverse(BiTree T)/*中序遍历*/ {
if(T)
{
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T)/*后序遍历*/ {
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
}
int Tree(BiTree T)
{
inthl,hr,h;
{
hl=Tree(T->lchild); /*求左子树深度*/
hr=Tree(T->rchild); /*求子树右深度*/
h=hl>hr? hl:hr;
NodeNum=NodeNum+1;
if(hl==0&&hr==0) BileafNum++; /*如果左右深度为0,即为叶子结点*/
return(h+1);
}
else return(0);
}
void LevelOrderTraverse(BiTree T)/*层序遍历*/
{
int front=0,rear=1;
BinTNode *cq[Max],*p;
cq[1]=T;
while(front!=rear)
{
front=(front+1)%NodeNum;
p=cq[front];
printf("%c",p->data);
if(p->lchild!=NULL){
rear=(rear+1)%NodeNum;
cq[rear]=p->lchild;
}
if(p->rchild!=NULL){
rear=(rear+1)%NodeNum;
cq[rear]=p->rchild;
}
}
}
int MAX(BiTree T)/*求最大元函数*/ {
if(T==NULL)
return 0;
if(T!=NULL)
{
if(T->data>max)
max=T->data;
MAX(T->lchild);
MAX(T->rchild);
}
return max;
}
int MIN(BiTree T)/*求最小元函数*/
{
if(T==NULL)
return 0;
if(T!=NULL)
{
if(T->data min=T->data; MIN(T->lchild); MIN(T->rchild); } return min; } void main() { BiTree root; int depth; printf("\n"); printf("按前序序列输入(如ABD##E##C#F##):");