二叉树的基本操作完整版包含二叉树的所有操作凡是你想要的都在里面数据结构版教学内容文档格式.docx

上传人:b****5 文档编号:20408094 上传时间:2023-01-22 格式:DOCX 页数:25 大小:152.83KB
下载 相关 举报
二叉树的基本操作完整版包含二叉树的所有操作凡是你想要的都在里面数据结构版教学内容文档格式.docx_第1页
第1页 / 共25页
二叉树的基本操作完整版包含二叉树的所有操作凡是你想要的都在里面数据结构版教学内容文档格式.docx_第2页
第2页 / 共25页
二叉树的基本操作完整版包含二叉树的所有操作凡是你想要的都在里面数据结构版教学内容文档格式.docx_第3页
第3页 / 共25页
二叉树的基本操作完整版包含二叉树的所有操作凡是你想要的都在里面数据结构版教学内容文档格式.docx_第4页
第4页 / 共25页
二叉树的基本操作完整版包含二叉树的所有操作凡是你想要的都在里面数据结构版教学内容文档格式.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

二叉树的基本操作完整版包含二叉树的所有操作凡是你想要的都在里面数据结构版教学内容文档格式.docx

《二叉树的基本操作完整版包含二叉树的所有操作凡是你想要的都在里面数据结构版教学内容文档格式.docx》由会员分享,可在线阅读,更多相关《二叉树的基本操作完整版包含二叉树的所有操作凡是你想要的都在里面数据结构版教学内容文档格式.docx(25页珍藏版)》请在冰豆网上搜索。

二叉树的基本操作完整版包含二叉树的所有操作凡是你想要的都在里面数据结构版教学内容文档格式.docx

请输入一个大于零的整数:

"

);

}}

returnnum;

}//NumJudge

StatusInitBiTree(BiTree&

T){

若申请空间失败则退出

//构造空二叉树Tif(!

(T=(BiTree)malloc(sizeof(BiTNode))))exit(ERROR);

//T->

next=NULL;

printf("

\n\t空二叉树构建成功!

\n\n"

returnOK;

}//InitBiTree

StatusDestroyTree(BiTree&

T,BiTreet){

//销毁二叉树

if(T){

free(T);

T=NULL;

\t二叉树销毁成功!

\n"

}

if(t){

DestroyTree(T,t->

lchild);

rchild);

free(t);

}//DestroyTree

StatusClearBiTree(BiTree&

T,intsum,int&

i){

//清空二叉树if(T){

ClearBiTree(T->

lchild,sum,i);

rchild,sum,i);

i++;

}if(i==sum){printf("

\t二叉树清空成功!

}returnOK;

}//ClearBiTree

StatusCreateBiTree(BiTree&

T,inti,intj,TElemTypech){//按先序次序输入二叉树中结点的值(一个字符),空格字符表示该结点为空//构造二叉链表示的二叉树T

TElemTypech1;

intk;

charstr[20];

if(i==0){printf("

\n按先序顺序建立二叉树:

请按提示输入相应的数据(一个字符),若提示结点数值为空,\n请输入空格\n\n"

%5s请输入树根:

"

}if(i!

=0&

i>

=j){printf("

%5s请输入%c的左孩子:

}if(j!

j>

i){printf("

%5s请输入%c的右孩子:

while

(1){//限制输入数据必须为字符型,否则重新输入

fflush(stdin);

for(k=0;

k<

20;

k++){

str[k]=getchar();

if(str[k]=='

\n'

)break;

if(k==0)printf("

%5s请输入一个字符后再按Enter键:

if(k==1)break;

if(k>

1)printf("

%5s您只能输入一个字符:

ch1=str[0];

//获取输入的准确字符型数据

if(ch1=='

'

){T=NULL;

returnERROR;

}//输入空格则为根结点为空

if(ch1!

='

){

if(!

(T=(BiTree)malloc(sizeof(BiTNode))))exit(ERROR);

T->

data=ch1;

//生成根结点ch=T->

CreateBiTree(T->

lchild,i,j,ch);

//构造左子树

j=i;

j++;

rchild,i,j,ch);

//构造右子树

i=0;

j=0;

}//CreateBitree

StatusTreeDepth(BiTreeT,intl,int&

h){

//若二叉树存在,返回其深度

l=l+1;

if(l>

h)h=l;

TreeDepth(T->

lchild,l,h);

rchild,l,h);

returnh;

}//TreeDepth

StatusGetRootElem(BiTreeT){

//获取根结点值

该二叉树的根结点值为:

%c\n\n"

T->

data);

}//GetRootElem

StatusSaveElem(BiTreeT,BiTree*Q,inti){

〃根据完全二叉树中,若本节点位置序号为i,则其左孩子结点为2i,右孩子为2i+1的方法

//保存二叉树的有效结点至指针数组Q特定的位置

Q[i]=T;

SaveElem(T->

lchild,Q,2*i);

rchild,Q,2*i+1);

}//SaveElem

StatusLev_Traverse(BiTreeT,inth){

//按层次从上到下,每层从左到右的顺序显示树状二叉树if(T==NULL){printf("

\n\t\t二叉树目前为空树\n\n"

BiTree*Q;

(Q=(BiTree*)malloc(int(pow(2,h)+1)*sizeof(BiTNode))))exit(ERROR);

inti,j,n=1,k=h;

for(i=1;

i<

=int(pow(2,h)+1);

i++){

Q[i]=NULL;

从左到右的顺序

SaveElem(T,Q,n);

//将目前有效结点按照满二叉树的序号存储

提示:

规定下图中的有效结点的位置序号从1开始按从上到下

依次递增\n"

=(pow(2,h)+1);

i++){//树形显示二叉树

if(int(pow(2,h))%i==0){

printf("

\t\t"

for(j=0;

j<

pow(2,k-1)-1;

j++){printf("

}k--;

}if(Q[i])printf("

%c"

Q[i]->

if(!

Q[i])printf("

for(j=0;

pow(2,k+1)-1;

}printf("

}//Lev_Traverse

StatusFirstPrint(BiTreeT,inti){

//按先序次序(递归)访问二叉树

if(i==0)printf("

\n先序(递归)遍历结果如下:

if(T){

%-5c"

//访问T

FirstPrint(T->

lchild,i);

//递归遍历左子树

rchild,i);

//递归遍历右子树

}//FirstPrintBiTree

StatusMiddlePrint(BiTreeT,inti){

//按中序次序(递归)访问二叉树

\n中序(递归)遍历结果如下:

MiddlePrint(T->

//递归遍历左子树

//访问TMiddlePrint(T->

//递归遍历右子树

}i=0;

returnOK;

}//MiddlePrint

StatusLastPrint(BiTreeT,inti){

//按后序次序(递归)访问二叉树

\n后序(递归)遍历结果如下:

LastPrint(T->

//访问T

}//LastPrint

StatusPreOrderTraverse(BiTreeT){

//按先序(非递归)遍历二叉树T

BiTreep,S,q;

intflag=0;

(S=(BiTree)malloc(sizeof(BiTNode))))exit(ERROR);

S->

//建立空栈S

p=T;

\n先序(非递归)遍历结果如下:

while

(1){

while

(1){//遍历存储并访问左子树直到根结点左孩子不存在

p->

q=S->

next;

next=p;

p->

next=q;

//当前结点进栈

if(p->

lchild)p=p->

lchild;

else{break;

while

(1){//栈顶指针出栈,如果当前栈顶指针的右孩子存在

则跳出循环

p=S->

next=p->

next&

!

rchild){flag=1;

break;

}//如果栈空并且当前结点右孩子不

存在则遍历结束

rchild){p=p->

rchild;

}}if(flag==1)break;

}//PreOrderTraverse

StatusInOrderTraverse(BiTreeT){

//中序遍历(非递归)二叉树T

\n中序(非递归)遍历结果如下:

while(p||S->

next){

if(p){q=S->

p=p->

}//左孩子进栈else{

if(p)printf("

//输出栈中元素

else{returnERROR;

}p=p->

}//InOrderTraverse

StatusPostOrderTraverse(BiTreeT){

//后序遍历(非递归)二叉树T

//建立空栈S

\n后序(非递归)遍历结果如下:

while

(1){//遍历左子树,若当前结点左右孩子都不存在则跳出

//当前结点进栈if(p->

else{

rchild)p=p->

while(S->

//栈顶指针出栈并访问

next)break;

//若栈空则跳出if(p==S->

next->

rchild)p=S->

//若当前结点为栈顶指针的右孩子,则继

续出栈

else{if(S->

rchild){//栈顶指针右孩存在,指针移至栈顶指针的

右孩子后跳出循环

//若栈空则跳出循环

}//PostOrderTraverse

StatusGetElemSum(BiTreeT){//计算二叉树中总结点的个数BiTreep,*q;

intl=0,h=0;

(q=(BiTree*)malloc(int(pow(2,TreeDepth(T,l,h))+1)*sizeof(BiTNode))))exit(ERROR);

inthead=1,tail=2;

q[1]=T;

while(head<

tail){p=q[head++];

if(p->

lchild)q[tail++]=p->

rchild)q[tail++]=p->

returnhead-1;

}//GetElemSum

StatusLevelOrderPrint(BiTreeT){

//二叉树T存在,层序遍历二叉树

//将二叉树中的结点按从上到下,从左到右的顺序存至指针数组q,然后按次序输出

BiTreep,*q;

(q=(BiTree*)malloc(GetElemSum(T)*sizeof(BiTNode))))exit(ERROR);

\n层序(非递归)遍历结果如下:

tail){

p=q[head++];

}//LevelOrderPrint

StatusGetElemNum(BiTreeT,TElemTypee){

//查找元素e在二叉树T中的个数及位置

intj,i=0,num=O,*a;

(a=(int*)malloc(GetElemSum(T)*sizeof(int))))exit(ERROR);

inthead=1,tail=2;

while(head<

data==e){num++;

a[i]=head-1;

}if(p->

\n元素%c在二叉树中的个数为:

%d\n"

e,num);

元素%c在二叉树中的位置序号为:

"

e);

i;

j++){

%-4d"

a[j]);

}//GetElemNum

StatusGetLeafNum(BiTreeT){

//计算二叉树T中叶子个数

intnum=0,head=1,tail=2;

lchild&

rchild)num++;

}//GetLeafNum

StatusLBrother(BiTreeT,intsum){

//求第num个结点的左兄弟

inti,num,head=1,tail=2;

请输入要查找的位置序号:

num=NumJudge(str);

if(num>

sum){printf("

您输入的位置序号大于有效结点个数\n"

};

if(num==tail-2)break;

}if(num==1)printf("

位置%d的%c没有左兄弟\n"

num,q[num]->

num;

i++){if(q[i]->

lchild==q[num]||q[i]->

rchild==q[num])break;

if(q[i]->

lchild==q[num])printf("

if(q[i]->

rchild==q[num])printf("

位置%d的%c的左兄弟为:

%c\n"

data,q[i]->

lchild->

}//LBrother

StatusRBrother(BiTreeT,intsum){

//求第num个结点的右兄弟

if(num==1)printf("

位置%d的%c没有右兄弟\n"

else{

}if(!

q[i]->

rchild||q[i]->

位置%d的%c没有右兄弟\n"

rchild&

位置%d的%c的右兄弟为:

rchild->

}//RBrother

StatusLchild(BiTreeT,intsum){

//求第num个结点的左孩子

intnum,head=1,tail=2;

}while(head<

if(num==tail-2)break;

if(q[num]->

lchild)printf("

位置%d的%c的左孩子为:

data,q[num]->

else{printf("

位置%d的%c的左孩子不存在\n"

}//Lchild

StatusRchild(BiTreeT,intsum){

//求第num个结点的右孩子

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

当前位置:首页 > 高等教育 > 历史学

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

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