读书人

急求帮助这个代码的递归有有关问题

发布时间: 2013-08-09 15:16:24 作者: rapoo

急急急,求帮助,这个代码的递归有问题,要怎么改
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAX_TREE_SIZE 100

//树的双亲表示结点结构定义
typedef struct
{
int data;
int parent;

}PTNode;

//双亲表示法树
typedef struct
{
PTNode node[MAX_TREE_SIZE];
int count;
}PTree;

//树的孩子兄弟表示结点结构定义
typedef struct node{
int data;
struct node *firstchild;
struct node *rightsib;
}BTNode,*BTree;


//初始化树(双亲表示法)
void init_ptree(PTree *tree)
{
tree->count=-1;
}


//初始化树的结点(孩子兄弟表示法)
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;
for(i=0;i<T.count;i++)
{
printf("%d",T.node[i].data);
}
}


//树的后序遍历(递归)
void inoeder(BTNode *T)
{
if(T!=NULL)
{
inoeder(T->firstchild);
printf("%d",T->data);
inoeder(T->rightsib);
}
}


//树后序遍历(非递归)
void inoeder2(PTree T)
{
int i;
for(i=T.count-1;i>=0;i--)
{
printf("%d",T.node[i].data);
}
}


//层次遍历、
void level(PTree T)
{
int i;
for(i=0;i<T.count;i++)
{
printf("%d",T.node[i].data);
}


}


//水平输出二叉树
void PrintBTree(BTNode *root,int level)
{
int i;
if(root!=NULL)
{
PrintBTree(root->rightsib,level+1);
for(i=1;i<=8*level;i++)
printf(" ");
printf("-------%d\n",root->data);
PrintBTree(root->firstchild,level+1);
}
}


//输出树
void print_ptree(PTree tree)
{
int i;
printf(" 序号 结点 双亲\n");
for(i=0;i<=tree.count;i++)
{
printf("%8d%8d%8d",i,tree.node[i].data,tree.node[i].parent);
printf("\n");
}
}


//用双亲法表示创建树
PTree CreatTree(PTree T)
{
int i=1;
int fa=0;
int ch=0;
PTNode p;
while(-1!=ch)
{
printf("输入第%d结点:",i++);
scanf("%d %d",&fa,&ch);
printf("\n");
p.data=ch;
p.parent=fa;
T.count++;
T.node[T.count].data=p.data;
T.node[T.count].parent=p.parent;
}
printf("\n");
printf("创建树的具体过程如下:\n");
print_ptree(T);
return T;

/*
int i=1;
int fa,ch;
PTNode p;
for(i=1;ch!=-1;i++)
{
printf("输入第%d结点:\n",i);
scanf("%d,%d",&fa,&ch);
printf("\n");
p.data=ch;
p.parent=fa;
T.count++;


T.node[T.count].data=p.data;
T.node[T.count].parent=p.parent;
}
printf("\n");
printf("创建树的具体过程如下:\n");
print_ptree(T);
return T;
*/
}


//一般树转化为二叉树
BTNode *change(PTree T)
{
int i,j=0;
BTNode p[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;i<T.count;i++)
{
p[i]=GetTreeNode(T.node[i].data);

}
for(i=1;i<T.count;i++)
{
ip=&p[i];
is=&p[j];
while(T.node[i].parent!=is->data)
{
j++;
is=&p[j];

}
if(!(is->firstchild))
{
is->firstchild=ip;
ir=ip;
}
else
{
ir->rightsib=ip;
ir=ip;
}
}
Tree=&p[0];
return Tree;
}


//主菜单界面
void Menu()
{
printf("*******************主菜单*******************\n");
printf("**************树与二叉树的转换**************\n");
printf("*************请输入数字选择功能*************\n");
printf("************1.用双亲法创建一般树************\n");
printf("************2.树的前序遍历(递归)**********\n");


printf("************3.树的前序遍历(非递归)********\n");
printf("************4.树的后序遍历(递归)**********\n");
printf("************5.树的后序遍历(非递归)********\n");
printf("************6.层次序的非递归遍历************\n");
printf("************7.退出程序**********************\n");
printf("********************************************\n");
printf("请输入指令:");

}



//副菜单
void Menu2()
{
printf("*******************副菜单*******************\n");
printf("************8.返回主菜单********************\n");
printf("************9.退出程序**********************\n");
}


//主函数
int main()
{
int i=0,c1,c2;
PTree T;
BTNode *Tree;
init_ptree(&T);
loop:
Menu();
scanf("%d",&c1);
switch(c1)
{
case 1:
printf("建立一般树,依次输入各个结点的情况:\n");
printf("输入结点的方式:双亲数据,整型数据(第一个结点双亲数据为-1,最后以-1,-1结束)\n例子:-1,1, 1,3\n");
T=CreatTree(T);
Tree=change(T);
PrintBTree(Tree,i);
getchar();
break;

case 2:
printf("树的前序遍历(递归):\n");
preorder(Tree);
printf("\n");
break;

case 3:
printf("树的前序遍历(非递归):\n");
preorder2(T);
printf("\n");
break;

case 4:
printf("树的后序遍历(递归):\n");


inoeder(Tree);
printf("\n");
break;

case 5:
printf("树的后序遍历(非递归):\n");
inoeder2(T);
printf("\n");
break;

case 6:
printf("树的层次遍历\n");
level(T);
printf("\n");
break;

case 7:
exit(1);
break;

}
Menu2();
scanf("%d",&c2);
if(c2==8)
{
goto loop;
}
else if(c2==9)
{
exit(1);
}
return 0;
}
C 递归 遍历 struct printf
[解决办法]
不明确问题啊 兄弟

读书人网 >C语言

热点推荐