二叉树的中序的递归非递归遍历算法.docx
- 文档编号:5528825
- 上传时间:2022-12-18
- 格式:DOCX
- 页数:17
- 大小:179.87KB
二叉树的中序的递归非递归遍历算法.docx
《二叉树的中序的递归非递归遍历算法.docx》由会员分享,可在线阅读,更多相关《二叉树的中序的递归非递归遍历算法.docx(17页珍藏版)》请在冰豆网上搜索。
二叉树的中序的递归非递归遍历算法
信息工程学院《数据结构》课程设计报告
设计题目二叉树的中序的递归、非递归遍历算法
专业班级
小组成员
一.题目:
二叉树的中序的递归、非递归遍历算法
二.小组任务分工
马凯:
编写二叉树中序递归遍历、非递归遍历
崔妍:
编写二叉树层序遍历、打印二叉树
三.设计目标
帮助学生熟练掌握二叉树的遍历;
四.问题描述
二叉树的中序的递归、非递归遍历算法,层次序的非递归遍历算法的实现,应包含建树为了的实现。
五.概要设计
实现上述程序功能,需要定义一个结构体
typedefstructtree//定义数据结构体
{
ElemTypedata;//数据信息
structtree*lchild;//左孩子
structtree*rchild;//右孩子
}TreeNode,*Tree;
typedefstruct//层序遍历的队列结构体定义
{
QElemTypebase[MAXQSIZEZ];
intfront;//定义队头
intrear;//定义队尾
}Sqstack1;
typedefstructstack//非递归遍历栈
{
Tree*base;//定义栈底
Tree*top;//定义栈顶
intstackszie;//指示栈内剩余空间
}Sqstack;
六.详细设计(程序代码及核心代码流程图)
总体操作步骤:
returnOK;
}
StatusDeQueue(Sqstack1*Q,QElemType*e)//删除元素
{
if(Q->front==Q->rear)//队为空,不能删除
returnERROR;
*e=Q->base[Q->front];
Q->front=(Q->front+1)%MAXQSIZEZ;
returnOK;
}
StatusQueueEmpty(Sqstack1Q)//判断队列是否为空
{
if(Q.rear==Q.front)
returnTRUE;
else
returnFALSE;
}
voidTraverse(TreeT)//层序遍历
{
Sqstack1Q;
Treep;
p=T;
InitQueue(&Q);//初始化
if(p)
ErQueue(&Q,p);
while(!
QueueEmpty(Q))
{
DeQueue(&Q,&p);//出队
printf("%c",p->data);
if(p->lchild)
ErQueue(&Q,p->lchild);
if(p->rchild)
ErQueue(&Q,p->rchild);
}
printf("\n");
}
//**********************************
//使用递归完成中序遍历
voidInOrder(Treeroot)
{
if(root)//如果根节点不为空,一句左根右的顺序遍历
{
InOrder(root->lchild);
printf("%c",root->data);
InOrder(root->rchild);
}
}
//初始化栈
voidInStack(Sqstack*s)
{
s->base=(Tree*)malloc(STACKINITSIZE*sizeof(TreeNode));//动态分配空间
if(!
s->base)
{
printf("栈创建失败!
");
}
s->top=s->base;
s->stackszie=STACKINITSIZE;//栈中的剩余内存
}
//压栈
voidPush(Sqstack*s,Treeroot)
{
if(((*s).top-(*s).base)>=(*s).stackszie)//判断栈是否满?
如果满
{
(*s).base=(Tree*)realloc((*s).base,((*s).stackszie+STACKINCREASESIZE)*sizeof(Tree));//扩容
if(!
(*s).base)
{
printf("内存分配失败!
");
}
(*s).top=(*s).base+(*s).stackszie;
(*s).stackszie+=STACKINCREASESIZE;
}
*(s->top)=root;
s->top++;//进行依次入栈操作
}
//获得栈顶元素
voidGetTop(Sqstack*s,Tree*root)
{
*root=*((*s).top-1);
}
//弹出栈顶元素
voidPop(Sqstack*s,Tree*root)
{
if((*s).top==(*s).base)//=与==
{
printf("栈已经空了!
");
}
*root=*(--(*s).top);
}
//判断栈是否为空
intStackEmpty(Sqstack*s)
{
if(s->top==s->base)
return1;
else
return0;
}
//非递归中序遍历
voidInOrderS(Treeroot)
{
Treep=root;
Sqstacks;
InStack(&s);
while(p||!
StackEmpty(&s))
{
if(p)
{
Push(&s,p);
p=p->lchild;
}
else
{
Pop(&s,&p);
printf("%c",p->data);
p=p->rchild;
}
}
}
voidPrintTree(Treeroot,intnLayer)//树状打印二叉树
{
inti;
if(root==NULL)
return;
PrintTree(root->rchild,nLayer+1);
for(i=0;i printf(""); printf("%c\n",root->data); PrintTree(root->lchild,nLayer+1); } voidmain() {intlayer=0; Treeroot=NULL; printf("先序遍历输入二叉树,#代表空子树: \n"); CreateTree(&root);//参数不懂 printf("递归中序遍历输出: \n"); InOrder(root); printf("\n"); printf("非递归中序遍历输出: \n"); InOrderS(root); printf("\n"); printf("层序遍历二叉树: \n"); Traverse(root); printf("打印二叉树: \n"); PrintTree(root,layer); printf("\n"); } 七.测试分析 测试内容 测试结果 输入二叉树 正确 递归中序遍历 正确 非递归中序遍历 正确 层序遍历 正确 打印二叉树 正确 八.课程设计总结 此次课程设计中,题目为二叉树的中序遍历、层序遍历,在完成这次设计过程中,遇到了好多问题,例如: 不知道如何循环完成二叉树的非递归遍历,如何利用栈和队列的特性,怎么将它们合理的进栈和出栈。 通过这次课程设计的设计,使我明白了自己在学习过程中的一些漏洞,比如,栈和队列中出入的一些细节的处理、结构体指针的应用、运行过程中内存的分配等。 #include #include #defineSTACKINITSIZE100 #defineSTACKINCREASESIZE20 //层序遍历部分 #defineTRUE1 #defineFALSE0 #defineOK1 #defineERROR0 #defineOVERFLOW-2 typedefintStatus; //******************************8 typedefcharElemType; typedefstructtree//定义数据结构体 { ElemTypedata;//数据信息 structtree*lchild;//左孩子 structtree*rchild;//右孩子 }TreeNode,*Tree;//重命名 //层序遍历 #defineMAXQSIZEZ100//宏定义最大长度 typedefTreeQElemType; typedefstruct//层序遍历的队列结构体定义 { QElemTypebase[MAXQSIZEZ]; intfront;//定义队头 intrear;//定义队尾 }Sqstack1; typedefstructstack//利用结构体定义栈 { Tree*base;//定义栈底 Tree*top;//定义栈顶 intstackszie;//指示栈内剩余空间 }Sqstack;//借助结构体对栈进行重命名 voidCreateTree(Tree*root)//创建一棵树 { chars;//定义树的根节点 s=getchar();//getchar和scanf的区别是什么手动从键盘输入字符 //描述树中表示空树时的情况 if(s=='#') { *root=NULL; } else { *root=(Tree)malloc(sizeof(TreeNode));//申请空间,用malloc函数动态分配空间 if(! root)//判断根节点是否为空,即,该树是否为空 { printf("分配内存失败! "); } (*root)->data=s;//将getcher得到的数据分配到树中//? CreateTree(&(*root)->lchild);//? CreateTree(&(*root)->rchild);//? } //返回值 } //层序遍历队列定义 voidInitQueue(Sqstack1*Q)//初始化前尾指针 { Q->front=Q->rear=0;//队头等于队尾 } StatusErQueue(Sqstack1*Q,QElemTypee)//入队 { if((Q->rear+1)%MAXQSIZEZ==Q->front)//判断对是否满? returnERROR; Q->base[Q->rear]=e; Q->rear=(Q->rear+1)%MAXQSIZEZ;//? returnOK; } StatusDeQueue(Sqstack1*Q,QElemType*e)//删除元素 { if(Q->front==Q->rear)//队为空,不能删除 returnERROR; *e=Q->base[Q->front]; Q->front=(Q->front+1)%MAXQSIZEZ;//? returnOK; } StatusQueueEmpty(Sqstack1Q)//判断队列是否为空 { if(Q.rear==Q.front) returnTRUE; else returnFALSE; } voidTraverse(TreeT)//层序遍历 { Sqstack1Q; Treep; p=T; InitQueue(&Q);//初始化 if(p) ErQueue(&Q,p); while(! QueueEmpty(Q)) { DeQueue(&Q,&p);//出队 printf("%c",p->data); if(p->lchild) ErQueue(&Q,p->lchild); if(p->rchild) ErQueue(&Q,p->rchild); } printf("\n"); } //********************************** //使用递归完成中序遍历 voidInOrder(Treeroot) { if(root)//如果根节点不为空,一句左根右的顺序遍历 { InOrder(root->lchild); printf("%c",root->data); InOrder(root->rchild); } } //初始化栈 voidInStack(Sqstack*s) { s->base=(Tree*)malloc(STACKINITSIZE*sizeof(TreeNode));//动态分配空间 if(! s->base) { printf("栈创建失败! "); } s->top=s->base; s->stackszie=STACKINITSIZE;//栈中的剩余内存 } //压栈 voidPush(Sqstack*s,Treeroot) { if(((*s).top-(*s).base)>=(*s).stackszie)//判断栈是否满? 如果满 { (*s).base=(Tree*)realloc((*s).base,((*s).stackszie+STACKINCREASESIZE)*sizeof(Tree));//扩容 if(! (*s).base) { printf("内存分配失败! "); } (*s).top=(*s).base+(*s).stackszie; (*s).stackszie+=STACKINCREASESIZE; } *(s->top)=root; s->top++;//进行依次入栈操作 } //获得栈顶元素 voidGetTop(Sqstack*s,Tree*root)//? ? ? ? ? ? ? { *root=*((*s).top-1); } //弹出栈顶元素 voidPop(Sqstack*s,Tree*root) { if((*s).top==(*s).base)//=与== { printf("栈已经空了! "); } *root=*(--(*s).top); } //判断栈是否为空 intStackEmpty(Sqstack*s) { if(s->top==s->base)//==写为= return1; else return0; } //非递归中序遍历 voidInOrderS(Treeroot) { Treep=root; Sqstacks; InStack(&s); while(p||! StackEmpty(&s)) { if(p) { Push(&s,p); p=p->lchild; } else { Pop(&s,&p);//参数 printf("%c",p->data); p=p->rchild; } } } voidPrintTree(Treeroot,intnLayer)//树状打印二叉树 { inti; if(root==NULL) return; PrintTree(root->rchild,nLayer+1); for(i=0;i printf(""); printf("%c\n",root->data); PrintTree(root->lchild,nLayer+1); } voidmain() {intlayer=0; Treeroot=NULL; printf("先序遍历输入二叉树,#代表空子树: \n"); CreateTree(&root);//参数不懂 printf("递归中序遍历输出: \n"); InOrder(root); printf("\n"); printf("非递归中序遍历输出: \n"); InOrderS(root); printf("\n"); printf("层序遍历二叉树: \n"); Traverse(root); printf("打印二叉树: \n"); PrintTree(root,layer); printf("\n"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 递归 遍历 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)