大作业二叉树.docx

上传人:b****5 文档编号:2867477 上传时间:2022-11-16 格式:DOCX 页数:19 大小:165.66KB
下载 相关 举报
大作业二叉树.docx_第1页
第1页 / 共19页
大作业二叉树.docx_第2页
第2页 / 共19页
大作业二叉树.docx_第3页
第3页 / 共19页
大作业二叉树.docx_第4页
第4页 / 共19页
大作业二叉树.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

大作业二叉树.docx

《大作业二叉树.docx》由会员分享,可在线阅读,更多相关《大作业二叉树.docx(19页珍藏版)》请在冰豆网上搜索。

大作业二叉树.docx

大作业二叉树

 

数据结构作业

 

年级:

2004级

(2)班

专业:

计算机科学与技术专业

学号:

200431500070

姓名:

陆雪

实现二叉树的各种算法

本项目“二叉树”的组成结构如图1所示:

本程序的模块结构图如图2所示,图中方框表示函数,方框中指出函数名,箭头表示函数间的调用关系。

源程序包含如下函数:

·CreateBTNode(BTNode*&b,char*str)由str串创建二叉树。

·*FindNode(BTNode*b,ElemTypex)返回data域为x的结点指针。

·*LchildNode(BTNode*p)找左孩子结点。

·*RchildNode(BTNode*p)找右孩子结点。

·BTNodeDepth(BTNode*b)求二叉树高度。

·BTWidth(BTNode*b)求二叉树宽度。

·DispBTNode(BTNode*b)输出二叉树。

·TravLevel(BTNode*b)层次遍历算法。

·PreOrder(BTNode*b)先序遍历算法。

·InOrder(BTNode*b)中序遍历算法。

·PostOrder(BTNode*b)后序遍历算法。

·Nodes(BTNode*b)求二叉树的结点个数。

·LeafNodes(BTNode*b)求二叉树的叶结点个数。

·DispLeaf(BTNode*b)输出所有叶子结点。

·AllPath(BTNode*b,ElemTypepath[],intpathlen)采用递归算法输出从根结点到叶子结点到叶子结点的路径。

·LongPath(BTNode*b,ElemTypepath[],intpathlen,ElemTypelongpath[],int&longpathlen)求最长路径。

窗体顶端

窗体底端

图1.二叉树项目组成

图2.二叉树项目的程序结构图

#include

#include

#defineMaxSize100

typedefcharElemType;

/*二叉树的链式存储结构*/

typedefstructnode

{

ElemTypedata;

structnode*lchild;一棵二叉树

structnode*rchild;

}BTNode;

/*创建二叉树CreateBTNode(*b,*str)*/

voidCreateBTNode(BTNode*&b,char*str)/*由str串创建二叉链*/

{

BTNode*St[MaxSize],*p=NULL;

inttop=-1,k,j=0;

charch;

b=NULL;/*建立的二叉树初始时为空*/

ch=str[j];

while(ch!

='\0')/*str未扫描完时循环*/

{

switch(ch)

{

case'(':

top++;St[top]=p;k=1;break;/*为左孩子结点*/

case')':

top--;break;

case',':

k=2;break;

/*为孩子结点右结点*/

default:

p=(BTNode*)malloc(sizeof(BTNode));

p->data=ch;p->lchild=p->rchild=NULL;

if(b==NULL)/**p为二叉树的根结点*/

b=p;

else/*已建立二叉树根结点*/

{switch(k)

{

case1:

St[top]->lchild=p;break;

case2:

St[top]->rchild=p;break;

}

}

}

j++;

ch=str[j];

}

}

/*返回data域为x的结点指针*/

BTNode*FindNode(BTNode*b,ElemTypex)

{

BTNode*p;

if(b==NULL)

returnNULL;

elseif(b->data==x)

returnb;

else

{

p=FindNode(b->lchild,x);

if(p!

=NULL)

returnp;

else

returnFindNode(b->rchild,x);

}

}

/*找孩子结点LchildNode(p)和RchildNode(p)*/

BTNode*LchildNode(BTNode*p)

{

returnp->lchild;

}

BTNode*RchildNode(BTNode*p)

{

returnp->rchild;

}

/*求高度BTNodeDepth(*b)*/

intBTNodeDepth(BTNode*b)

{intlchilddep,rchilddep;

if(b==NULL)return(0);/*空树的高度为0*/

else

{lchilddep=BTNodeDepth(b->lchild);

/*求左子树的高度为lchilddep*/

rchilddep=BTNodeDepth(b->rchild);

/*求右子树的高度为rchilddep*/

return(lchilddep>rchilddep)?

(lchilddep+1):

(rchilddep+1);

}

}

/*求二叉树b的宽度*/

intBTWidth(BTNode*b)

{

struct

{

intlno;/*结点的层次编号*/

BTNode*p;/*结点指针*/

}Qu[MaxSize];/*定义顺序非循环队列*/

intfront,rear;/*定义队首和队尾指点针*/

intlnum,max,i,n;

front=rear=0;

if(b!

=NULL)

{

rear++;

Qu[rear].p=b;/*根结点指针入队*/

Qu[rear].lno=1;/*根结点的层次编号为1*/

while(rear!

=front)

{

front++;

b=Qu[front].p;/*队头出队*/

lnum=Qu[front].lno;

if(b->lchild!

=NULL)/*左陔子入队*/

{

rear++;

Qu[rear].p=b->lchild;

Qu[rear].lno=lnum+1;

}

if(b->rchild!

=NULL)/*右孩子入队*/

{

rear++;

Qu[rear].p=b->rchild;

Qu[rear].lno=lnum+1;

}

}

max=0;lnum=1;i=1;/*lnum从第1层开始*/

while(i<=rear)/*通过比较相同层次的结点数求树的宽度*/

{

n=0;

while(i<=rear&&Qu[i].lno==lnum)

{

n++;/*n累计lnum层次的结点个数*/

i++;

}

lnum=Qu[i].lno;

if(n>max)max=n;/*将最大层次结点数赋给max*/

}

returnmax;/*返回max值*/

}

else

return0;

}

/*输出二叉树DispBTNode(*b)*/

voidDispBTNode(BTNode*b)

{if(b!

=NULL)

{printf("%c",b->data);

if(b->lchild!

=NULL||b->rchild!

=NULL)

{

printf("(");

DispBTNode(b->lchild);/*递归处理左子树*/

if(b->rchild!

=NULL)

printf(",");

DispBTNode(b->rchild);/*递归处理右子树*/

printf(")");

}

}

}

/*层次遍历算法*/

voidTravLevel(BTNode*b)

{

BTNode*Qu[MaxSize];/*定义顺序循环队列*/

intfront,rear;/*定义队首和队尾指针*/

front=rear=0;/*置队列为空队列*/

if(b!

=NULL)

printf("%c",b->data);

rear++;/*结点指针进入队列*/

Qu[rear]=b;

while(rear!

=front)/*队列不为空*/

{

front=(front+1)%MaxSize;

b=Qu[front];/*队头出队列*/

if(b->lchild!

=NULL)/*输出左孩子,并入队列*/

{

printf("%c",b->lchild->data);

rear=(rear+1)%MaxSize;

Qu[rear]=b->lchild;

}

if(b->rchild!

=NULL)/*输出右孩子,并入队列*/

{

printf("%c",b->rchild->data);

rear=(rear+1)%MaxSize;

Qu[rear]=b->rchild;

}

}

printf("\n");

}

/*先序遍历的递归算法*/

voidPreOrder(BTNode*b)

{

if(b!

=NULL)

{

printf("%c",b->data);/*访问根结点*/

PreOrder(b->lchild);

PreOrder(b->rchild);

}

}

/*中序遍历的递归算法*/

voidInOrder(BTNode*b)

{

if(b!

=NULL)

{InOrder(b->lchild);

printf("%c",b->data);/*访问根结点*/

InOrder(b->rchild);

}

}

/*后序遍历递归算法*/

voidPostOrder(BTNode*b)

{

if(b!

=NULL)

{

PostOrder(b->lchild);

PostOrder(b->rchild);

printf("%c",b->data);/*访问根结点*/

}

}

/*求二叉树的结点个数*/

intNodes(BTNode*b)

{

intnum1,num2;

if(b==NULL)/*树空的情况*/

return0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1