在网上找树与二叉树的转换的算法一直没找到,只有图形讲解,只能怪自己技术太低,但是实验报告又得交啊.....难度A还算简单,只要遍历二叉树就行,但是难度B实现二叉树与树的相互转换感觉太不容易了,在网上找了半天还是不能做出来。于是翻开书仔细看,发现树的孩子兄弟表示法正好和二叉树的表示很像,于是利用二叉树的左子树和孩子兄弟表示法中的孩子指针相似,二叉树的右子树和孩子兄弟指针相似,于是终于在建立的二叉树的基础上把其对应的树的形式打印出来了。求高手指点指点:在这段代码的基础上实现真正的二叉树与树的转换。
下面是程序:
- #include<stdio.h>
- #include<stdlib.h>
- typedefstructBiTNode{
- chardata;//定义二叉树的数据部分
- structBiTNode*lchild;//定义二叉树的左孩子(树的孩子)
- structBiTNode*rchild;//定义二叉树的右孩子(树的孩子兄弟)
- }BiTNode,*BiTree;
- voidCreatBiTree(BiTree*T)//创建二叉树
- {
- charch;
- ch=getchar();
- if(ch=='*')
- *T=NULL;
- else{
- if(!(*T=(BiTree)malloc(sizeof(structBiTNode)))){
- printf("内存分配失败!");return;
- }
- else{
- (*T)->data=ch;
- CreatBiTree(&((*T)->lchild));
- CreatBiTree(&((*T)->rchild));
- }
- }
- }
- voidPreOrderTraverse(BiTreeT)//前序遍历二叉树(递归)
- {
- if(T){
- printf("%c",T->data);
- if(T->lchild)
- PreOrderTraverse(T->lchild);
- if(T->rchild)
- PreOrderTraverse(T->rchild);
- }
- }
- voidInOrderTraverse(BiTreeT)//中序遍历二叉树(递归)
- {
- if(T){
- if(T->lchild)
- InOrderTraverse(T->lchild);
- printf("%c",T->data);
- if(T->rchild)
- InOrderTraverse(T->rchild);
- }
- }
- voidPostOrderTraverse(BiTreeT)//后序遍历二叉树(递归)
- {
- if(T){
- if(T->lchild)
- PostOrderTraverse(T->lchild);
- if(T->rchild)
- PostOrderTraverse(T->rchild);
- printf("%c",T->data);
- }
- }
- voidPrintBinary(BiTreeT,intnLayer)//打印二叉树
- {
- if(T==NULL)return;
- PrintBinary(T->rchild,nLayer+1);
- for(inti=0;i<=nLayer;i++)
- {printf("");}
- printf("%c/n",T->data);
- PrintBinary(T->lchild,nLayer+1);
- }
- voidPrintTree(BiTreeT,intnLayer)//将二叉树以树的形式打印出来
- {
- if(T==NULL)return;
- for(inti=0;i<=nLayer;i++)
- printf("");
- printf("%c/n",T->data);
- PrintTree(T->lchild,nLayer+1);
- PrintTree(T->rchild,nLayer);
- }
- intmain()//主函数部分
- {
- BiTreeT=NULL;
- intLayer=0;
- intLayerT=0;
- printf("请输入二叉树:/n");
- CreatBiTree(&T);printf("你输入的二叉树为:(竖型树状表示)/n");
- PrintBinary(T,Layer);
- printf("/n");
- printf("先序遍历二叉树为:/n");
- PreOrderTraverse(T);
- printf("/n");
- printf("中序遍历二叉树为:/n");
- InOrderTraverse(T);
- printf("/n");
- printf("后序遍历二叉树为:/n");
- PostOrderTraverse(T);
- printf("/n");
- printf("二叉树转换为树显示出来为:(竖型树状表示)/n");
- PrintTree(T,LayerT);
- system("pause");
- return0;
- }