树的四种遍历方式

树一共有四种遍历方式,包括前序遍历,中序遍历,后序遍历和层序遍历。
前中后三种方式的代码是相似的,而层序遍历的却不同。
前序遍历是第一次遇到这个节点输出,中序遍历是第二次遇到这个节点输出,后序遍历是第三次遇到这个节点输出。
层序遍历是通过队列的方式遍历。

//前序遍历
void preordertraversal(bintree t)
{
    if(t)
    {
        printf("%d ",t->data );
        preordertraversal(t->left );
        preordertraversal(t->right );
    }
}

//中序遍历
void inordertraversal( bintree t )
{
    if(t)
    {   
            inordertraversal(t->left );
            printf("%d ",t->data );
            inordertraversal(t->right );

    }
}

//后序遍历
void postordertraversal(bintree t)
{
    if(t)
    {
        postordertraversal(t->left );
        postordertraversal(t->right );
        printf("%d ",t->data);
    }
}

//层序遍历
void levelordertraversal( bintree t )
{
    position queue[200];
    int head = 0 ;
    int tail = 0 ;
    if(!t)
        return ;
    if(t)
    {
        queue[tail++] = t;
        while(head!=tail)
        {
            position t = queue[head++];
            printf("%d ",t->data );
            if(t->left != NULL)
                queue[tail++] = t->left ;
            if(t->right != NULL)
                queue[tail++] = t->right ;
        }
    }
}

完整代码(用了插入操作):

#include<stdio.h>
#include<stdlib.h>
typedef struct node* position;
typedef position bintree;
struct node{

    int data;
    bintree left;
    bintree right;

};


bintree insert(bintree t,int data)
{
    if(!t)
    {   
        bintree gg;
        gg = (bintree)malloc(sizeof(struct node));
        gg-> data = data;
        gg-> left = gg-> right = NULL;
        return gg;
    }

    else if(data > t-> data) 
        t-> right = insert(t-> right ,data);
    else 
        t-> left = insert(t-> left ,data);
        return t;

 } 

void preordertraversal(bintree t)
{
    if(t)
    {
        printf("%d ",t->data );
        preordertraversal(t->left );
        preordertraversal(t->right );
    }
}


void inordertraversal( bintree t )
{
    if(t)
    {   
            inordertraversal(t->left );
            printf("%d ",t->data );
            inordertraversal(t->right );

    }
}

void postordertraversal(bintree t)
{
    if(t)
    {
        postordertraversal(t->left );
        postordertraversal(t->right );
        printf("%d ",t->data);
    }
}

void levelordertraversal( bintree t )
{
    position queue[200];
    int head = 0 ;
    int tail = 0 ;
    if(!t)
        return ;
    if(t)
    {
        queue[tail++] = t;
        while(head!=tail)
        {
            position t = queue[head++];
            printf("%d ",t->data );
            if(t->left != NULL)
                queue[tail++] = t->left ;
            if(t->right != NULL)
                queue[tail++] = t->right ;
        }
    }
}

int main()
{
        int n;
        bintree t = NULL ;//记得设空节点!
        scanf("%d",&n);
        int num;
        for(int i = 0; i < n; i++ )
        {
            scanf("%d",&num);
            t = insert(t,num);//注意!
         } 

        printf("Inorder:");    inordertraversal(t);    printf("\n");
        printf("Preorder:");   preordertraversal(t);   printf("\n");
        printf("Postorder:");  postordertraversal(t);  printf("\n");
        printf("Levelorder:"); levelordertraversal(t); printf("\n");
}

猜你喜欢

转载自blog.csdn.net/qiulianshaonv_wjm/article/details/81453607