16.层次遍历

代码。

/*
     层次遍历
 */

#include<iostream>
#include<cstdlib>
using namespace std;

typedef char Elemtype;
typedef struct node
{
    Elemtype data;
    struct node* left;
    struct node* right;
}Tree;


//先序建立一个树,NULL指针用0代替
Tree* create_tree(void)
{
    Tree* root=NULL;
    char ch;

    cin>>ch;
    if(ch=='0')
        return NULL;
    else
    {
            root=(Tree*)malloc(sizeof(Tree));
            root->data=ch;
            root->left=create_tree();
            root->right=create_tree();
    }
    return root;
}

void free_tree(Tree* t)
{
    if(t)
    {
        free_tree(t->left);
        free_tree(t->right);
        free(t);
        t=NULL;
    }
}

/*建立队列*/
#define MAX 100
typedef struct 
{
    Tree* data[MAX];
    int front;
    int tail;
}Queue;

Queue* create_queue(void)
{
    Queue* q=(Queue*)malloc(sizeof(Queue));
    if(q)
        q->tail=q->front=0;
    else
        cout<<"create queue error"<<endl;
    return q;
}

int empty_queue(Queue* q)
{
    if(q->front==q->tail)
        return 1;
    return 0;
}

int full_queue(Queue* q)
{
    if((q->tail+1)%MAX==q->front)
        return 1;
    return 0;
}

void push_queue(Queue* q,Tree* t)
{
    if(full_queue(q))
        return ;

    q->data[q->tail]=t;
    q->tail=(q->tail+1)%MAX;
}

void pop_queue(Queue* q,Tree** t)
{
    if(empty_queue(q))
        return;
    *t=q->data[q->front];
    q->front=(q->front+1)%MAX;
}

void free_queue(Queue* q)
{
    free(q);
}

//层次遍历
void cengci(Tree* t)
{
    Tree *p=t;
    Queue* q;

    q=create_queue();
    push_queue(q,p);
    while(!empty_queue(q))
    {
        pop_queue(q,&p);
        if(p!=NULL)
        {
            cout<<p->data<<" ";
            push_queue(q,p->left);
            push_queue(q,p->right);
        }
    }
    free_queue(q);
    cout<<endl;    
}


int main(void)
{
    Tree *root;
    root=create_tree();
    
    cengci(root);
    return 0;
}

 

posted on 2013-07-24 15:24  紫金树下  阅读(201)  评论(0编辑  收藏  举报