正文

树的层号表示转化为树的孩子表示(数组方式)2006-04-11 23:43:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/jixian/12279.html

分享到:

#include<iostream>using namespace std;#define m 3                        //树的度数#define maxsize 50                 //数组元素个数最大值typedef char datatype;            typedef struct node                //树的扩充孩子表示(数组方式)法中结点类型 多了 双亲{ datatype data; int child[m]; int parent;}treenode; typedef struct                     //层号表示法中结点的类型{ int lev; datatype data;}levelnode;                     treenode tree[maxsize];            //树的扩充孩子表示法的存储数组int root;                          //根结点下标int length;                        //树中实际所含结点个数 levelnode ltree[maxsize];          //树层号表示法的数组 void leveltotree(int length,levelnode ltree[],int* root,treenode tree[]){//树的层号表示转换成树的扩充孩子表示 int i,j,k; for(i=0;i<length;++i)          //初始化整棵树的孩子   for(j=0;j<m;j++)   tree[i].child[j]=-1;    *root=0;                       //第一个元素为根结点 tree[0].data=ltree[0].data;    //产生根结点 tree[0].parent=-1;             //根结点双亲为空 for(i=1;i<length;i++) {  tree[i].data=ltree[i].data; //每个结点都看作是(子树的)根结点 ,看下树组方式图就明白了  j=i-1;  if(ltree[i].lev > ltree[j].lev) //结点i为其前一个元素j的第一个子女,注意是:  第一个!  {   tree[i].parent=j;   tree[j].child[0]=i;          //直接写 child[0]   第一个子女嘛  }  else  {   while(ltree[i].lev <ltree[j].lev)  //寻找结点i的兄弟(结点i必与结点j的某个前件是兄弟)    j=tree[j].parent;    tree[i].parent = tree[j].parent;   // 结点i和结点j的双亲相同      j=tree[j].parent;                  //注意j的变化   k=0;                               //将结点i挂到双亲结点上      while(tree[j].child[k]!=-1)        //此时 tree[i]就不一定是tree[j] 第一个孩子了          k++;   tree[j].child[k]=i;  } }} int main(){ int i=-1; cout<<"请输入树结点(层号表示)"<<endl; int level;          //暂时性存放层号, datatype dat;       //暂时性存放结点数据 while(1)     {  cin>>level; // if(level==' '||level==',')  // 便于格式输入,结点之间可以用 ,或 空格 隔开??/怎么实现 ,因为这里 level 是int型所以不能输入字符型。              //  continue;               //当然可以先输入dat,但输入就反了,变成先输入数据,在输入层号。   if(level==0)             //直到输入为换行符结束??  注意level 不是字符型,而是int型   break;                    cin>>dat;  ++i;  ltree[i].lev=level;           ltree[i].data=dat;   } length=i;          // levelnode ltree[]={{1,'a'},{2,'b'},{2,'c'},{5,'f'},{5,'g'},{5,'h'},{2,'d'},{2,'e'},{3,'j'},{3,'i'}};// length=10;        //当初就是因为上面那一直出错,才这样直接复值。 leveltotree(length,ltree,&root,tree); cout<<"输出结点(孩子(数组方式)表示法):"<<endl; for(i=0;i<length;i++) {  cout<<tree[i].data<<"  ";            //输出根结点  for(int j=0;j<m;j++)                 //输出孩子   cout<<tree[i].child[j]<<"  ";  cout<<tree[i].parent;                //输出双亲  cout<<endl; }}  

阅读(3177) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册