I come, I see, I conquer

                    —Gaius Julius Caesar

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
/************************************************************************/
/*
/* example input: ABD###CE#F###
/* bi-tree built:
/*                 A
/*                / \
/*               B   C
/*              /   /
/*             D   E
/*                  \
/*                   F
/* 
/* level traverse: A B C D E F
/*
/***********************************************************************
*/
#include 
<stdio.h>
#include 
<malloc.h>
#include 
<process.h>

#define OK        1
#define ERROR     0
#define OVERFLOW  -2

typedef 
int Status;
typedef 
int TElemType;

/* 二叉树的链式存储结构 */
typedef 
struct BiTNode {
    TElemType data;
    
struct BiTNode *lchild, *rchild;
} BiTNode, 
*BiTree;

typedef BiTNode
* QElemType;

/* 单链队列的存储结构 */
typedef 
struct QNode{
    QElemType data;
    
struct QNode *next;
} QNode, 
*QueuePtr;

typedef 
struct {
    QueuePtr front;
    QueuePtr rear;
} LinkQueue;

/* 树的操作函数 */
Status PrintElement(TElemType e);
BiTree CreateBiTree(BiTree T);
Status LevelTraverse(BiTree T, Status (*Visit)(TElemType e));

/* 队列操作函数 */
Status InitQueue(LinkQueue 
&Q);
Status QueueEmpty(LinkQueue Q);
Status EnQueue(LinkQueue 
&Q, QElemType e);
Status DeQueue(LinkQueue 
&Q, QElemType &e);

BiTree T 
= NULL;

void main() 
{
    T 
= CreateBiTree(T);
    printf(
"\nlevel traverse: ");
    LevelTraverse(T, PrintElement);


Status PrintElement(TElemType e)
{
    printf(
"%c ", e);
    
return OK;
}

BiTree CreateBiTree(BiTree T)
{
    
char ch;
    ch 
= getchar();
    
if('#' == ch)
        T 
= NULL;
    
else {
        
if(!(T = (BiTNode *)malloc(sizeof(BiTNode))))
            exit(OVERFLOW);
        T
->data = ch;
        T
->lchild = CreateBiTree(T->lchild);
        T
->rchild = CreateBiTree(T->rchild);
    }
    
return T;
}
Status LevelTraverse(BiTree T, Status (*Visit)(TElemType))
{
    LinkQueue Q; QElemType e;
    InitQueue(Q);
    EnQueue(Q, T);
    
while (!QueueEmpty(Q)) {
        DeQueue(Q, e);
        
if (e) {
            Visit(e
->data);
            EnQueue(Q, e
->lchild);
            EnQueue(Q, e
->rchild);
        }
    }
    
return OK;
}

Status InitQueue(LinkQueue 
&Q) {
    
//构造一个空队列Q
    Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
    
if (!Q.front) exit(OVERFLOW);
    Q.front
->next = NULL;
    
return OK;
}

Status DestroyQueue(LinkQueue 
&Q) {
    
//销毁队列Q
    while (Q.front) {
        Q.rear 
= Q.front->next;
        free(Q.front);
        Q.front 
= Q.rear;
    }
    
return OK;
}

Status QueueEmpty(LinkQueue Q)
{
    
if (Q.front == Q.rear && Q.front->next == NULL) return true;
    
else return false;
}

Status EnQueue(LinkQueue 
&Q, QElemType e) {
    
//插入元素e为Q的新的队尾元素
    struct QNode *= (QueuePtr)malloc(sizeof(QNode));
    
if (!p) exit(OVERFLOW);
    p
->data = e; p->next = NULL;
    Q.rear
->next = p;
    Q.rear 
= p;
    
return OK;
}

Status DeQueue(LinkQueue 
&Q, QElemType &e) {
    
//若队列不空, 则删除Q的队头元素, 用e返回其值, 并返回OK;
    
//否则返回ERROR
    struct QNode *= NULL;
    
if (Q.front == Q.rear) return ERROR;
    p 
= Q.front->next;
    e 
= p->data;
    Q.front
->next = p->next;
    
if (Q.rear == p) Q.rear = Q.front;
    free(p);
    
return OK;
}
posted on 2011-04-21 01:17  jcsu  阅读(1448)  评论(0编辑  收藏  举报