前序遍历的层号表示转孩子数组表示法

来源:互联网 发布:js清空数组中所有元素 编辑:程序博客网 时间:2024/04/19 15:05

思路:有一个层号表示法,如 1a,2b,2s,3v,3e,2e,3w

我们可以看出若当前层号比前一个的层号要大,则说明该节点是前一个节点的儿子,若相等,则说明是兄弟,若小于,则说明前面最近的那棵子树建立完毕。

当前点的层号比上个节点大时,直接将该节点的父亲记录为上一个节点,若相等,记录兄弟的父亲,若小于,则不断找该节点的兄弟。

#include<iostream>#include<cstdio>#include<cstring>#define maxn 11111#define m 3using namespace std;struct node{    char data;    int child[m];    int parent;//记录该节点父亲节点的下标    node()//重载,初始化    {        for(int i=0;i<m;i++) child[i]=-1;        parent = -1;    }};struct Tree{    node treelist[maxn];    int len;};struct Levenode//存放层号和值{    char data;    int leve;};int length;//节点的个数void prepost(Tree &t,int n)//孩子数组的前序遍历{    if(n==t.len) return ;    cout<<t.treelist[n].data;    for(int i=0;i<m;i++)       if(t.treelist[n].child[i]!=-1) prepost(t,t.treelist[n].child[i]);}void levetotree(Levenode leve[],Tree *t)//将层号表示法转化为孩子数组表示法{   int j;   t->treelist[0].data=leve[0].data;//根节点直接放入   for(int i=1;i<length;i++)   {       t->treelist[i].data=leve[i].data;       j=i-1;       if(leve[i].leve>leve[j].leve)//当前节点的层号比前一个节点的层号大,则该节点为前一个节点的儿子       {           t->treelist[i].parent=j;           t->treelist[j].child[0]=i;//当前节点标记为前一个节点的儿子       }       else//否则有两种情况,层号相等则为兄弟,当前层号小于前一个节点的层号表明前一个子树已经建完       {           while(leve[i].leve<leve[j].leve) j=t->treelist[j].parent;//找到当前节点的兄弟,因为子树的深度不同,所以用循环           t->treelist[i].parent=t->treelist[j].parent;//兄弟间父亲相同           j=t->treelist[i].parent;//找到父亲           int k = 0;           while(t->treelist[j].child[k]!=-1&&k<m) k++;//找父亲存放儿子下标的空位           t->treelist[j].child[k]=i;//记录儿子下标           //cout<<t->treelist[i].data<<endl;       }   }}int main(){    Levenode leve[maxn];    Tree t;    cin>>length;    for(int i=0;i<length;i++) cin>>leve[i].leve>>leve[i].data;    levetotree(leve,&t);    prepost(t,0);    return 0;}


0 0
原创粉丝点击