EOJ 1811 树的遍历

来源:互联网 发布:墙布 知乎 编辑:程序博客网 时间:2024/05/22 11:46


#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的子节点。再进行循环,另外注意后序遍历的递归方法,将后序遍历的输出写到每次调用递归的最后。

0 0
原创粉丝点击