二叉树的遍历以及树与二叉树的转换课程设计.docx
- 文档编号:30081498
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:25
- 大小:241.82KB
二叉树的遍历以及树与二叉树的转换课程设计.docx
《二叉树的遍历以及树与二叉树的转换课程设计.docx》由会员分享,可在线阅读,更多相关《二叉树的遍历以及树与二叉树的转换课程设计.docx(25页珍藏版)》请在冰豆网上搜索。
二叉树的遍历以及树与二叉树的转换课程设计
课程设计(数据结构)
院、系专业
姓名学号
指导教师
2010年月日
树的应用
摘要:
关键词:
树;二叉树;转换;遍历;递归和非递归
1.实验题目
实现树与二叉树的转换的实现。
以及树的前序、后序的递归、非递归算法,层次序的非递归算法的实现,应包含建树的实现。
2.实验分析
2.1总体分析
2.1.1本程序的功能是对任意二叉树进行递归前序遍历和后序遍历,用栈实现非递归的前序、和后序遍历,还有对树的层序遍历以及树与二叉树的转换。
2.1.2本程序要求用户以字符输入,若要实现终端结点,最后以回车键建入数据。
2.1.3本程序的结果将依次打印出递归前序遍历和后序遍历,用栈实现非递归的前序和中序遍历和后序遍历,和线索化层序遍历,输入树及树传换成二叉树。
2.2具体分析
2.2.1二叉树创建
用链表实现创建一个树结点的结构体,从键盘输入数据,存入数组。
把下标为2*i+1的值存入左孩子,
为2*i+2的存入右孩子。
BiNodecreat(),BiNodestree_creat(char*a,intk)。
2.2.2先序遍历二叉树的递归算法
若二叉树为空,则空操作;否则
(1)访问根结点;
(2)先序遍历左子树;(3)先序遍历右子树。
voidPreOrder(BiNoderoot)。
2.2.3中序遍历二叉树的递归算法
若二叉树为空,则空操作;否则
(1)中序遍历左子树;
(2)访问根结点;(3)中序遍历右子树。
voidInOrder(BiNoderoot)。
2.2.4后序遍历二叉树的递归算法
若二叉树为空,则空操作;否则
(1)后序遍历左子树;
(2)后序遍历右子树。
(3)访问根结点;voidPostOrder(BiNoderoot)。
2.2.5先序非递归算法
BiNode根指针,若BiNode!
=NULL对于非递归算法,引入栈模拟递归工作栈,初始时栈为空。
问题:
如何用栈来保存信息,使得在先序遍历过左子树后,能利用栈顶信息获取BiNode的右子树的根指针?
voidF_PreOrder(BiNoderoot)
2.2.6中序非递归算法
BiNode是要遍历树的根指针,中序遍历要求在遍历完左子树后,访问根,再遍历右子树。
问题:
如何用栈来保存信息,使得在中序遍历过左子树后,能利用栈顶信息获取BiNode指针?
voidF_inOrder(BiNoderoot)。
2.2.7后序非递归算法
BiNode是要遍历树的根指针,后序遍历要求在遍历完左右子树后,再访问根。
需要判断根结点的左右子树是否均遍历过。
voidF_PostOrder(BiNoderoot)。
2.2.8层次序遍历算法
按照树的层次从左到右访问树的结点,层序遍历用于保存结点的容器是队列。
voidLevelOrder(BiNoderoot)。
2.2.9树与二叉树的转换算法
转换时结点的第一个孩子变为它的左孩子,兄弟节点变为他的有孩子。
voidexchange(),classTree.
3.实验步骤
3.1流程图
图1、二叉树的创建
图2、前序递归遍历
图3、中序递归遍历
图4、后序递归遍历
图5、前序非递归遍历
图6、中序非递归遍历
图7、后序非递归遍历
图8、层序遍历
3.2代码:
#include
usingnamespacestd;
#include
#include
#definemaxsize100
#include"tree.h"
#defineLENsizeof(structbtree)
intmax=1;
typedefstructbtree//二叉树节点结构体
{
btree*lchild,*rchild;
chardata;
}*BiNode;
typedefstructStackElemType//栈的结构体
{
BiNodeptr;
intflag;
}StackElemType;
BiNodep;
//二叉树的建立
BiNodestree_creat(char*a,intk)
{
BiNoderoot;max++;
if(a[k]=='\0'||k>maxsize)
returnNULL;//判断树是否为空
else
{
root=(BiNode)malloc(LEN);//动态申请节点
root->data=a[k];
root->lchild=stree_creat(a,2*k+1);//递归调用为左孩子赋值
root->rchild=stree_creat(a,2*k+2);//递归调用为右子赋值
returnroot;//返回根节点指针
}
}
voidprint(BiNoderoot)//输出所创建的二叉树
{
BiNodeh[maxsize]={NULL};
inttop=0,base=0,j=0,k=0,n=0,m=0;
h[top]=root;
j=log(max+1)/log
(2)-1;
if(pow(2,j+1)-1 cout<<"你刚输入的是: \n"; while(h[base]! =NULL)//把二叉树的值依次存入数组 { h[++top]=h[base]->lchild; h[++top]=h[base]->rchild; base++; } for(top=0;h[k]! =NULL;top++)//按层输出 { m=pow(2,j)-top;//计算每行输出的空格数 if(top! =0)m=m-top; for(n=0;n cout<<""; for(base=0;base =NULL;base++)//控制每层输出的个数 { if(h[k]->data=='0')cout<<"["<<"]";//当为空时输出[] elsecout< k++; } cout<<"\n"; for(n=0;n<(m-1);n++) cout<<""; for(base=0;base =NULL;base++) cout<<"/"<<"|"; cout<<"\n"; } } //二叉树的后序遍历递归算法 voidPostOrder(BiNoderoot) { if(root==NULL)return;//递归调用的约束条件 else { PostOrder(root->lchild); PostOrder(root->rchild); if(root->data=='0'); elsecout<<"["< } } //二叉树的中序遍历递归算法 voidInOrder(BiNoderoot) { if(root==NULL)return;//递归调用的约束条件 else { InOrder(root->lchild); if(root->data=='0'); elsecout<<"["< InOrder(root->rchild); } } //二叉树的前序递归遍历算法 voidPreOrder(BiNoderoot){ if(root==NULL)return;//递归调用的约束条件 else { if(root->data=='0'); else cout<<"["< PreOrder(root->lchild); PreOrder(root->rchild); } } //二叉树的前序遍历非递归算法 voidF_PreOrder(BiNoderoot) { BiNodes[maxsize];//申请一个BiNode数组 inttop=0;//采用顺序栈,并假定不会发生上溢 do{ while(root! =NULL)//当结点不为空时 { if(root->data=='0'); else cout<<"["< s[++top]=root;//依次将结点压入栈 root=root->lchild;//根赋值为它的左孩子 } if(top>0)//当节点为空但栈顶不为零时 { root=s[top--];栈顶下移把栈顶元素负给根结点 root=root->rchild;根赋值为它的右子 } }while(root! =NULL||top>0); } //中序非递归遍历算法 voidF_inOrder(BiNoderoot) { BiNodes[maxsize];//申请一个BiNode数组 inttop=0;//采用顺序栈,并假定不会发生上溢 do{ while(root! =NULL)//当结点不为空时 { s[++top]=root;//依次将结点压入栈 root=root->lchild;//根赋值为它的左孩子 } if(top>0)//当节点为空但栈顶不为零时 { root=s[top];把栈顶元素负给根结点 if(root->data=='0'); elsecout<<"["< root=s[top--];栈顶下移把栈顶元素负给根结点 root=root->rchild;根赋值为它的右子 } }while(root! =NULL||top>0); } //后序非递归遍历算法 voidF_PostOrder(BiNoderoot) { ;申请一个StackElemType数组 BiNodep=root; inttop=0; do{ while(p! =NULL)//当结点不为空时 { s[top].flag=0;//标记位负为零 s[top].ptr=p;//将树的结点依次压入栈中 p=p->lchild;//树沿左子树下移 top++; } while(s[top-1].flag==1)//当栈的最上面元素标记位为一时输出 {if(s[top-1].ptr->data=='0')top--; else cout<<"["< } if(top>0)//当节点为空但栈顶不为零时 { s[top-1].flag=1;栈的最上面元素标记位赋值为一 p=s[top-1].ptr;栈的最上面元素树结点赋给p p=p->rchild;树沿右子树下移 } }while(top>0); } //层序遍算法 voidLevelOrder(BiNoderoot) { BiNodes[maxsize];//申请一个BiNode数组 intmax,i=0; s[0]=root;//数组首元赋为根结点 while(root! =NULL)//当结点不空时 { s[2*i+1]=root->lchild;//左孩子赋给下标为2*i+1的数组员 s[2*i+2]=root->rchild;//右孩子赋给下标为2*i+1的数组员 i++; root=s[i];//root变为当前数组元素的值 max=i; } for(i=0;i { if(s[i]->data=='0'); else cout<<"["< } } voidPause() { cout< system("pause"); cout< } //树转换为二叉树 voidexchange(){ Tree myTree1.InputTree();//调用InputTree()函数 Pause(); myTree1.ShowTree();//调用ShowTree()函数 Pause(); myTree1.Show_BinaryTree();//调用Show_BinaryTree()函数 Pause(); } //输入二叉树信息的函数 BiNodecreat() { BiNodep=NULL; cout<<"请输入你的二叉树(请按层次由上往下从左到右依次输入并按#结束,如果节点为空请输入'0',本遍历器仅支持单字符),输入为: \n"; inti=0,j=0; charb[maxsize]={'#'},n; //当输入不为'#'时给数组赋值 do{ cin>>n; if(n! ='#')b[i]=n; i++; }while(n! ='#'); p=stree_creat(b,0);//创建树 print(p);//输出树 returnp; } //主函数 intmain() { intk; cout<<"\n"; cout<<"\n____________________________________________________________________________"; cout<<"|欢迎使用树的多种遍历器|"; cout<<"|树与二叉树的转换|"; cout<<"||"; cout<<"|____________________________________________________________________________|\n"; do{ cout<<"\n"; cout<<"\n1.创建二叉树"; cout<<"\n2.前序递归遍历算法"; cout<<"\n3.中序递归遍历算法"; cout<<"\n4.后序递归遍历算法"; cout<<"\n5.前序非递归遍历算法"; cout<<"\n6.中序非递归遍历算法"; cout<<"\n7.后序非递归遍历算法"; cout<<"\n8.层序非递归遍历算法"; cout<<"\n9.树与二叉树的转换"; cout<<"\n10.退出操作\n"; cout<<"请选择你要进行的操作(数字键): "; cin>>k; switch(k){ case1: { p=creat();//调用creat()创建二叉树 }break; case2: { cout<<"二叉树的前序递归遍历: "; PreOrder(p);//调用PreOrder(p)前序遍历 }break; case3: { cout<<"二叉树的中序递归遍历: "; InOrder(p);//调用InOrder(p)中序遍历 }break; case4: { cout<<"二叉树的后序递归遍历: "; PostOrder(p);//调用PostOrder(p)后序遍历 }break; case5: { cout<<"二叉树前序非递归遍历: "; F_PreOrder(p);//调用F_PreOrder(p)前序遍历 }break; case6: { cout<<"二叉树中序非递归遍历: "; F_inOrder(p);//调用F_inOrder(p)中序遍历 }break; case7: { cout<<"二叉树后序非递归遍历: "; F_PostOrder(p); }break; case8: { cout<<"二叉树层序非递归遍历: "; LevelOrder(p); }break; case9: { exchange();//调用exchange()实现树与二叉树的转换 deletep; returnmain();//返回主函数 }break; } }while(k>=0&&k<9); return0; } 3.3截图界面 1.运行程序出现以下界面 2.输入1选择创建二叉树 3.输出树,输入2选择前序递归遍历。 4.输入3、4分别选择中序、后序递归便利 5.输入5、6分别选择前序、中序非递归遍历 6.输入7、8分别选择后序、层序非递归遍历 7.输入9选择树与二叉树的转换,按提示输入树的信息 8.输出树的形状 9.输出转换成的二叉树的形状 四.结论 五.分工部分data<<"]";data<<"]";//依次输出
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 遍历 以及 转换 课程设计