大作业二叉树.docx
《大作业二叉树.docx》由会员分享,可在线阅读,更多相关《大作业二叉树.docx(19页珍藏版)》请在冰豆网上搜索。
大作业二叉树
数据结构作业
年级:
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;