www.pudn.com > datastructor.rar > BiTree.c


#include  
 
/*------------- 二叉树的二叉链表存储表示 -------------*/ 
typedef enum {OVERFLOW = -1, ERROR = 0, FALSE = 0, TRUE, OK} Status; 
typedef int TElemType; 
typedef struct BiTNode { 
    TElemType   data; 
    struct BiTNode *lchild, *rchild; 
}BiTNode, *BiTree; 
 
/*-------------------- 栈的存储表示 --------------------*/  
#define STACK_INIT_SIZE 10 
#define STACKINCREMENT  5 
//typedef enum {TURE, FAKSE} boolean 
typedef BiTree SElemType; 
typedef struct { 
    SElemType *base; 
    SElemType *top; 
    int stacksize; 
}SqStack; 
/*----------------栈的基本操作的实现 ------------------*/ 
void InitStack( SqStack *S ) { 
    S->base = (SElemType *)  
                malloc(STACK_INIT_SIZE * sizeof(SElemType)); 
    S->top = S->base; 
    S->stacksize = STACK_INIT_SIZE; 
} 
 
void Push(SqStack *S, SElemType e) { 
    if(S->top - S->base >= S->stacksize) { 
        S->base = (SElemType *) realloc(S->base, 
                (S->stacksize + STACKINCREMENT) * sizeof(SElemType));  
        S->top = S->base + S->stacksize;   
        S->stacksize += STACKINCREMENT; 
    } 
    *S->top++ = e; 
} 
 
void Pop(SqStack *S, SElemType *e) { 
    //if(S->top == S->base) eixt(-1); 
    *e = *--S->top; 
} 
 
int StackEmpty(SqStack *S) { 
    if(S->top == S->base) return 1; 
    return 0; 
} 
 
void GetTop(SqStack *S, SElemType *e) { 
    *e = *--S->top; 
}     
 
 
/*---------------- 二叉树的基本操作的实现 -----------------*/ 
Status CreateBiTree(BiTree *Tr){ 
    BiTree T; 
    TElemType   ch; 
     
    printf("Enter element:\n"); 
    scanf("%d", &ch); 
    if(ch == 0) T = NULL; 
    else{ 
        T = (BiTNode *)malloc(sizeof(BiTNode)); 
        if(!T) exit(OVERFLOW); 
        T->data = ch; 
        CreateBiTree( &(T->lchild) ); 
        CreateBiTree( &(T->rchild) ); 
    } 
    return OK; 
} 
 
Status PreOrderTraverse(BiTree T, Status (* Visit)(TElemType e) ){ 
    // 
    // 
} 
/* 
Status InOrderTraverse(BiTree T, Status (* Visit) (TElemType e) ){ 
    SqStack S; SElemType p; 
     
    InitStack(&S); Push(&S, T); 
    while(!StackEmpty(&S) ){ 
        while(GetTop(&S, &p) && p) Push(&S, p->lchild); 
        Pop(&S, &p); 
        if(!StackEmpty(&S) ){ 
            Pop(&S, &p); if(!Visit(p->data) ) return ERROR; 
            Push(&S, p->rchild); 
        } 
    } 
    return OK; 
} 
           
Status InOrderTraverse(BiTree T, Status (* Visit) (TElemType e) ){ 
    // 
    // 
    SqStack S; InitStack(&S); 
    BiTree p = T; 
     
    while(p || !StackEmpty(&S) ){ 
        if(p) { Push(&S, p); p = p->lchild; } 
        else{ 
            Pop(&S, &p); if(!Visit(p->data) ) return ERROR; 
            p = p->rchild; 
        } 
    } 
    return OK; 
} 
 
Status PostOrderTraverse(BiTree T, Status (* Visit)(TElemType e) ){ 
    // 
    // 
} 
 
Status LevelOrderTraverse(BiTree T, Status (* Visit)(TElemType e) ){ 
    // 
    // 
}  
*/ 
/*--------------------- main()函数 ---------------------*/ 
Status PrintElement(TElemType e){ 
    printf("%3d", e); 
    return OK; 
} 
     
int main() 
{ 
    BiTree tree; 
    
    CreateBiTree(&tree); 
    //printf("%d, %d, %d\n", tree->data, tree->lchild->data, tree->rchild->data); 
     
    //InOrderTraverse(tree, PrintElement); 
    system("pause"); 
    return 0; 
}