教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 教育文库 >

二叉树的基本操作完整版,包含二叉树的所有操作,凡是你想要的都在(2)

来源:网络收集 时间:2026-08-01
导读: if(!S-next)break; //若栈空则跳出 if(p==S-next-rchild)p=S-next; //若当前结点为栈顶指针的右孩子,则继 else{ if(S-next-rchild){ //栈顶指针右孩存在,指针移至栈顶指针的 } } p=S-next-rchild;break; 续出栈 }

if(!S->next)break; //若栈空则跳出

if(p==S->next->rchild)p=S->next; //若当前结点为栈顶指针的右孩子,则继

else{

if(S->next->rchild){ //栈顶指针右孩存在,指针移至栈顶指针的

} } p=S->next->rchild;break; 续出栈

} 右孩子后跳出循环 } if(!S->next)break; //若栈空则跳出循环 printf("\n\n"); return OK;

}//PostOrderTraverse

Status GetElemSum(BiTree T){

//计算二叉树中总结点的个数

BiTree p,*q; int l=0,h=0; if(!(q=(BiTree *)malloc(int(pow(2,TreeDepth(T,l,h))+1) * sizeof(BiTNode))))exit(ERROR); int head=1,tail=2; q[1]=T; while(head<tail){ p=q[head++];

if(p->lchild)q[tail++]=p->lchild;

if(p->rchild)q[tail++]=p->rchild;

}

return head-1;

}//GetElemSum

Status LevelOrderPrint(BiTree T){

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

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

BiTree p,*q; if(!(q=(BiTree *)malloc(GetElemSum(T) * sizeof(BiTNode))))exit(ERROR); int head=1,tail=2;

q[1]=T;

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

while(head<tail){ p=q[head++]; printf("%-5c",p->data); if(p->lchild)q[tail++]=p->lchild; if(p->rchild)q[tail++]=p->rchild;

}

printf("\n\n");

return OK;

}//LevelOrderPrint

Status GetElemNum(BiTree T,TElemType e){

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

int j,i=0,num=0,*a;

BiTree p,*q; if(!(q=(BiTree *)malloc(GetElemSum(T) * sizeof(BiTNode))))exit(ERROR); if(!(a=(int *)malloc(GetElemSum(T) * sizeof(int))))exit(ERROR); int head=1,tail=2; q[1]=T; while(head<tail){ p=q[head++]; if(p->data==e){num++; a[i]=head-1;i++;} if(p->lchild)q[tail++]=p->lchild; if(p->rchild)q[tail++]=p->rchild; } printf("\n元素%c在二叉树中的个数为: %d\n",e,num); printf("元素%c在二叉树中的位置序号为:",e); for(j=0;j<i;j++){ printf("%-4d",a[j]); } printf("\n");

return num;

}//GetElemNum

Status GetLeafNum(BiTree T){

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

BiTree p,*q;

if(!(q=(BiTree *)malloc(GetElemSum(T) * sizeof(BiTNode))))exit(ERROR); int num=0,head=1,tail=2; q[1]=T; while(head<tail){ p=q[head++]; if(!p->lchild&&!p->rchild)num++; if(p->lchild)q[tail++]=p->lchild;

if(p->rchild)q[tail++]=p->rchild;

}

return num;

}//GetLeafNum

Status LBrother(BiTree T,int sum){

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

BiTree p,*q; if(!(q=(BiTree *)malloc(GetElemSum(T) * sizeof(BiTNode))))exit(ERROR); int i,num,head=1,tail=2; char str[20]; q[1]=T; printf("请输入要查找的位置序号: "); num=NumJudge(str); if(num>sum){printf("您输入的位置序号大于有效结点个数\n");return ERROR;}; while(head<tail){ p=q[head++];

if(num==tail-2)break;

if(p->lchild)q[tail++]=p->lchild;

if(p->rchild)q[tail++]=p->rchild;

}

if(num==1)printf("位置%d的%c没有左兄弟\n",num,q[num]->data);

else{

} for(i=1;i<num;i++){ if(q[i]->lchild==q[num]||q[i]->rchild==q[num])break; } if(q[i]->lchild==q[num])printf("位置%d的%c没有左兄弟\n",num,q[num]->data); if(q[i]->rchild==q[num])printf("位置%d的%c的左兄弟为: %c\n",num,q[num]->data,q[i]->lchild->data);

return OK;

}//LBrother

Status RBrother(BiTree T,int sum){

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

BiTree p,*q; if(!(q=(BiTree *)malloc(GetElemSum(T) * sizeof(BiTNode))))exit(ERROR); int i,num,head=1,tail=2; char str[20]; q[1]=T; printf("请输入要查找的位置序号: "); num=NumJudge(str); if(num>sum){printf("您输入的位置序号大于有效结点个数\n");return ERROR;}; while(head<tail){

p=q[head++];

if(num==tail-2)break;

if(p->lchild)q[tail++]=p->lchild;

if(p->rchild)q[tail++]=p->rchild;

} if(num==1)printf("位置%d的%c没有右兄弟\n",num,q[num]->data);

for(i=1;i<num;i++){

if(q[i]->lchild==q[num]||q[i]->rchild==q[num])break; else{

}

if(!q[i]->rchild||q[i]->rchild==q[num])printf("位置%d的%c没有右兄弟\n",num,q[num]->data);

if(q[i]->rchild&&q[i]->lchild==q[num])printf("位置%d的%c的右兄弟为: %c\n",num,q[num]->data,q[i]->rchild->data);

}

return OK;

}//RBrother

Status Lchild(BiTree T,int sum){

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

BiTree p,*q; if(!(q=(BiTree *)malloc(GetElemSum(T) * sizeof(BiTNode))))exit(ERROR); int num,head=1,tail=2; char str[20]; q[1]=T; printf("请输入要查找的位置序号: "); num=NumJudge(str); if(num>sum){printf("您输入的位置序号大于有效结点个数\n");return ERROR;} while(head<tail){ p=q[head++];

if(num==tail-2)break;

if(p->lchild)q[tail++]=p->lchild;

if(p->rchild)q[tail++]=p->rchild;

} if(q[num]->lchild)printf("位置%d的%c的左孩子为: %c\n",num,q[num]->data,q[num]->lchild->data);

else{printf("位置%d的%c的左孩子不存在\n",num,q[num]->data);}

return OK;

}//Lchild

Status Rchild(BiTree T,int sum){

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

BiTree p,*q; if(!(q=(BiTree *)malloc(GetElemSum(T) * sizeof(BiTNode))))exit(ERROR); int num,head=1,tail=2; char str[20]; q[1]=T;

printf("请输入要查找的位置序号: "); num=NumJudge(str);

if(num>sum){printf("您输入的位置序号大于有效结点个数\n");return ERROR;} while(head<tail){

p=q[head++];

if(num==tail-2)break;

if(p->lchild)q[tail++]=p->lchild;

if(p->rchild)q[tail++]=p->rchild;

}

if(q[num]->rchild)printf("位置%d的%c的右孩 …… 此处隐藏:3878字,全部文档内容请下载后查看。喜欢就下载吧 ……

二叉树的基本操作完整版,包含二叉树的所有操作,凡是你想要的都在(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/115621.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)