树的遍历

来源:互联网 发布:孙骁骁家庭知乎 编辑:程序博客网 时间:2024/06/18 07:44

利用树的扩展先根遍历序列创建度一定的树,然后实现树的先根次序遍历、后根次序遍历,层序遍历。

在对树做任何运算之前,树本身必须存在,因此,首先必须创建树,实际上就是建立树的存储结构。

例树的扩展前序序列为"AB###C###D###",度为3,则由此建立的树的先根次序序列为:ABCD,后序序列为:BCDA,层序序列是:ABCD

此程序按层序遍历的时候使用了<queue>库

具体代码:

#include <stdio.h>

#include <sys/malloc.h>

#include <stdlib.h>

#include<iostream>

#include <string.h>

#include<queue>

using namespace std;


#define m 3


#define MAXLEN 100


typedef char datatype;


typedef struct node {

    datatype data;

    struct node *child[m];

} node;


typedef  node *tree;


/********************************************************/

/*  函数功能:根据树的前序遍历结果建立一棵3度树             */

/*  函数返回值:树根地址                                   */

/*  文件名:tree.h,函数名:createtree ()                    */

/********************************************************/


tree  createtree()//按前序遍历顺序建立一棵3度树的递归算法

{

    int i;

    char ch;

    tree t;

    if ((ch=getchar())=='#')

        t=NULL;

    else

    {

        t=(tree) malloc (sizeof(node));

        t->data=ch;

        for (i=0;i<m;++i){

            t->child[i]= createtree();

        }

    }

    return t;

}


void preorder(tree t)

{

    int i;

    if (t)

    {

        printf("%c",t->data);

        for (i=0;i<m;i++)

            preorder(t->child[i]);

    }

}


void postorder(tree t)

{

    int i;

    if (t)

    {

        for (i=0;i<m;i++)

            postorder(t->child[i]);

        printf("%c",t->data);

    }

}



void levelorder(tree t)

{

    if(t)

    {

        queue <tree> Q;

        tree p;

        Q.push(t);

        while(!Q.empty())

        {

            p=Q.front();

            Q.pop();

            printf("%c",p->data);

            for (int i=0;i<m;i++)

                if(p->child[i])

                    Q.push(p->child[i]);

        }

    }

    

}


int main()

{

    tree t;

    t=createtree();

    preorder(t);

    printf("\n");

    postorder(t);

    printf("\n");

    levelorder(t);

    printf("\n");

    return 0;

}


结果:

AB###C###D###


ABCD
BCDA
ABCD




原创粉丝点击