//递归前序遍历
void r_preorder(NODE *t, int m)
{
int i;
if(t!=NULL)
{
printf("%c",t->data);
for(int i=0;i<m;i++) r_preorder(t->child[i],m);
}
}
//非递归前序遍历
void s_preorder(NODE *t, int m)
{
NODE* s[MAXN];//顺序栈,用于保存尚未遍历树的根节点的地址
int top=0;
if(t==NULL) return;
s[top++]=t;
while(top>0)
{
t=s[--top];
cout<<t->data<<endl;
for(int i=m-1;i>=0;i--) {
if(t->child[i]!=NULL) s[top++]=t->child[i];
}
}
}
//按层次遍历
void levorder(NODE *t, int m)
{
NODE*q[100],*p;
int head,tail;
if(t==NULL) return;
q[0]=t;head=0;tail=1;
while(head<tail) {
p=q[head++];
cout<<p->data;
for(int i=0;i<m;i++) {
q[tail++]=p->child[i];
}
}
}
//建树
NODE *buildTreeByParent(PNODE inputTree[],int m,int n)
//m:树的次数,n:结点数,inputTree中按层次排序
{
NODE *root,*p,*q,*addr_NODE[MAXN];
if(n<1) return NULL;
//初始化根节点
root=(NODE*)malloc(sizeof(NODE));
root->data=inputTree[0].data;
for(int i=0;i<m;i++) root->child[i]=NULL;
//数组记录每个结点的指针,方便后面找父亲
addr_NODE[0]=root;
for(int i=1;i<n;i++) {
//初始化后n-1个结点
q=(NODE*)malloc(sizeof(NODE));
q->data=inputTree[i].data;
for(int j=0;j<m;j++) q->child[j]=NULL;
//结点存在数组里
addr_NODE[i]=q;
//找到父亲指向自己
p=addr_NODE[inputTree[i].parent];
int j=-1;
while(p->child[++j]!=NULL) p->child[j]=q;
}
return root;
}
NODE *buildTreeByParent(NODE inputTree[],int m,int n)
{
NODE* addr_NODE[MAXN];
if(n<1) return;
for(int i=0;i<n;i++) {
addr_NODE[i]=(NODE*)malloc(sizeof(NODE));
addr_NODE[i]->data=inputTree[i].data;
for(int j=0;j<m;j++) addr_NODE[i]->child[j]=NULL;
}
for(int i=1;i<n;i++) {
int j=0;
while(addr_NODE[inputTree[i].parent]->child[j++]!=NULL);
addr_NODE[inputTree[i].parent]->child[j]=addr_NODE[i];
}
return addr_NODE[0];
}
树
最新推荐文章于 2023-04-24 20:02:17 发布