#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的子节点。再进行循环,另外注意后序遍历的递归方法,将后序遍历的输出写到每次调用递归的最后。
本文介绍了一种使用层号标识法构建树形结构的方法,并提供了完整的C++实现代码。该方法首先定义了两种结构体,一种用于存储层号标识的节点,另一种用于构建最终的树形结构。通过遍历层号标识的节点并递归地构建树,最终实现了树的创建及后序遍历。
550

被折叠的 条评论
为什么被折叠?



