#include <iostream>
#include <stdlib.h>
#include <stdio.h>
struct DNODE//构建层号标示法的节点
{
int lev;
char data;
};
struct Node//构建树的节点
{
int lev;
char data;
Node* parent;
Node* child[30];
Node(DNODE a)//树的节点的初始化,Node的data,lev与层号标示法的相同
{
data=a.data;
lev=a.lev;
for(int i=0;i<30;i++)//顺便将Node的子节点,父节点设为空
child[i]=NULL;
parent=NULL;
}
};
DNODE a[30];
Node* buildtree(DNODE *a,int n)//建树
{
Node *root,*p,*q;
if(n<1) return NULL;
root=new Node(a[0]);//根节点先设置为a[0]
p=root;
for(int i=1;i<n;i++)//将剩余的n-1个节点放入到Node中
{
q=new Node(a[i]);//生成新节点
while(p->lev>=q->lev)//如果p的层号大于等于q的层号,就寻找p的父节点
p=p->parent;
q->parent=p;//q的父节点此时就为p
int j=-1;
while(p->child[++j]!=NULL);//寻找p的不为空的子节点
p->child[j]=q;//将q放入p的子节点
p=q;
}
return root;//返回根节点
}
void postorder(Node *root)//后序遍历打印树的节点
{
if(root)//如果树非空
{
for(int i=0;i<30;i++)
{
if(root->child[i])//如果子节点非空
postorder(root->child[i]);//递归调用postorder函数
else break;
}
printf("%c",root->data);//后序遍历,最后打印节点值
}
}
int main()
{
int n;
scanf("%d",&n);//输入节点的个数
getchar();//读入换行符
int i;
for(i=0;i<n;i++)
{
scanf("(%d,%c)",&a[i].lev,&a[i].data);//注意输入的结构
getchar();//每次读入空格
}
Node *root=buildtree(a,n);//建树
postorder(root);//后序遍历
printf("\n");
return 0;
}
注意树的层号标示时需要建立两个struct,一个存储最后的树,一个用来存储层号标示的节点。使用层号标示的节点来初始化树的节点,然后每次寻找此节点的根节点,插入到根节点的子节点中。插入后,注意要将q赋值给p,即p现在是刚刚的p的子节点。再进行循环,另外注意后序遍历的递归方法,将后序遍历的输出写到每次调用递归的最后。