树与二叉树转换的实现3.docx
《树与二叉树转换的实现3.docx》由会员分享,可在线阅读,更多相关《树与二叉树转换的实现3.docx(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、河南工程学院数据结构与算法课程设计成果报告树与二叉树转换的实现子树,从根开始一直向右,遇到的右子树均依次作为树的子树(二叉树中结点的 右子树中变为该结点右侧的兄弟),将树转化成二叉树。void TreeToBTree(CTreeNode *ctroot,BTreeNode *&btroot)树转化为二叉树 ctroot指向树的根结点,btroot,指向二叉树的根(QueueCTree *VisitedCTreeNodes;QueueBTree *VisitedBTreeNodes;辅助队歹UinitQueueCTree(VisitedCTreeNodes);initQueueBTree(Vis
2、itedBTreeNodes);/初始化队歹 UCTreeNode *ctnode;BTreeNode *btnode,*p,*LastSibling;int i;btroot=(BTreeNode *)malloc(sizeof(BTreeNode);/添力口开辟内存空 间语句btroot-data=ctroot-data; 树的根结点作为二叉树的根结点 btroot-lchild=btroot-rchild=NULL;addQueueCTree(VisitedCTreeNodesctroot);/树 的根结 点入队 addQueueBTree(VisitedBTreeNodes,btroo
3、t);/二叉树的根结点入队 while(!QueueCTreeEmpty(VisitedCTreeNodes)(ctnode = delQueueCTree(VisitedCTreeNodes);/树结,点出队btnode = delQueueBTree(VisitedBTreeNodes);/二叉树结,点出队 for(i=0;ichildreni=NULL) 孩子结点访问完毕break;p=(BTreeNode *)malloc(sizeof(BTreeNode);/分配二叉树结点 p-data=ctnode-childreni-data;p-lchild=p-rchild=NULL;if(
4、i=0)btnode-lchild=p;长子,作为父结点的做孩子elseLastSibling-rchild=p; 作为上一个兄弟结点的右孩子LastSibling=p;addQueueCTree(VisitedCTreeNodes,ctnode-children1);/树结点进队列addQueueBTree(VisitedBTreeNodes,p);/二又树结点进门队歹 U)void Preorder(BTreeNode *T)(if(T)(coutT-dataPreorder(T-lchild);Preorder(T-rchild);)3程序清单初始化树(双亲表示法) void init_
5、ptree(PTree *tree) ( -tree-count=-l;)初始化树结点(孩子兄弟表示法)BTNode GetTreeNode(int x)(BTNode t;t.data=x;t.firstchild=t.rightsib=NULL; return t;树的前序遍历(递归)void preorder(BTNode *T)(if(T!=NULL)(printf(%d ,T-data);preorder(T-firstchild);preorder(T-rightsib);)树的前序遍历(非递归)void preorder2(PTree T) (int i,j=0;BTNode p
6、MAX_TREE_SIZE;BTNode *ip,*is,*ir,*Tree;ip=(BTNode *)malloc(sizeof(BTNode);is=(BTNode *)malloc(sizeof(BTNode);ir=(BTNode *)malloc(sizeof(BTNode);Tree=(BTNode *)malloc(sizeof(BTNode);for(i=0;iT.count;i+)(pi=GetTreeNode(T.nodei.data);)for(i=l;idata) (9j+;is=&pj;)if(!(is-firstchild)(is-firstchild=ip; ir
7、=ip;)elseir-rightsib=ip; ir=ip;)Tree=&p0;return Tree;)/*主菜单*/void Menu()printf(= printf。* 输入 1 printf。*输入 2- printf(”*输入 3printf(= printf。* 输入 1 printf。*输入 2- printf(”*输入 3printf( printf( printf( printf(“* * *ii * * *输入4-输入5-输入6:输入0二主菜单=n“);- 以双亲法创立一棵一般树*n“); 树的前序遍历(递归)*n);- 树的后序遍历(递归)*n“); 树的前序遍历(非
8、递归)*n“); 树的后序遍历(非递归)*n”);- 层次序的非递归遍历*n“);退出程序* *printf(= printf(”请输入执行的指令/*副菜单*/void Menu2()nH);-=nH);printf( 5I, n II ).printf( 5I, n II ).printf(printf(“* * *“* * *返回主菜单继续操作*n);退出程序*n”)/*主函数*/ void main() int i=0,cl,c2;PTree T;BTNode *Tree; init_ptree(&T);loop: Menu();scanfCd&cl);switch(cl)iocase
9、1:printf(建立一般树/衣次输入各个结点情况:n);printf(“输入结点方式:双亲数据,整型数据(第一个结点双亲数据为为最后以-1,-1 结束)n 例子:-LI l,3nM);T=CreatTree(T);Tree=change(T);print一般树转换成二叉树后的情况:n“);PrintBTree(TreeJ); getchar();break;case 2:printf(“树的前序遍历(递归):n);preorder(Tree);printf(n);break;case 3:printf(树的后序遍历(递归):n);inoeder(Tree);printfCXn);break;
10、case 4:printf(树的前序遍历俳递归):n“);preorder2(T);printf(n);break;case 5:printf(树的后序遍历俳递归):n);inoeder2(T);printf(n);break;case 6:printf(树的层次遍历:rT);level(T);printf(n);break;case 0:exit ;break;)Menu2();scanf(%d,&c2);if(c2=9)goto loop;else if(c2=0)exit(l);114测试输入执行的命令之后得到树的层次遍历。如图4.1-问x|u: D:CYuYanbinwwtemp.ex
11、e*二 * 二 * 二 树一一 般i一3二 二 二 二 二二 二 二 二 二*_二 二 二 二 二 二 二二 二 二 二 二 二 二历. 12 3 4k*9返 回 主菜单继续操作*退 出 fe.,序*xy *x*x图4. 1树的层次遍历输入执行的命令之后得到树的前序遍历。如图4.2行的指令:2 遍历递归:行的指令:2 遍历递归:raiD:CYuYanbin.wwtemp .exe,般树转换成二叉树后的情况: 1w w wQ二4副是单 xxxxxxxxxxxxxxxxxxx 返回王茎单继续操作* 退出程序 XXXXXXXXXXXXXXXXX输分 输入 WA 必 朝八主菜单=-阪粉坪藤/一至祠E树
12、的前序遍历(递归* 的序遍历序遍历(遍历递递 可一二,* * 333昌 11 菜单 X X WX M X XX X X X X M X XX X返回至菜单继续操作*图4. 2树的前序遍历12输入执行的命令之后得到树的后序遍历。如图4.3I P:cI P:c. In x1艮由程芹XAkMWXAX请施入执行的指令:2 树的前序遍历递归:返向全卷单继续操作*15.出程 序 *WM4T嗡入1输入2备入3瑜入4u = nn = n主菜单nu=nu=以双养法创立一棵一般梃 a的前序遍历,遢归 * 的后皮遍历璇启) 的前在调厉琲递归* 的唐存通原牛逸归)* 次序的罪递归遍历*迟出售序清前入执行的指令门 树的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 转换 实现
限制150内