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


#include  
#include  
 
typedef char TElemType; 
typedef struct BiTnode{ 
    TElemType   data; 
    struct BiTnode *lchild, *rchild; 
}BiTNode, *BiTree; 
 
void CreateBiTree(BiTree *T){ 
    TElemType   ch; 
 
    printf("Enter element(enter '#' node is empty):\n"); 
    ch = getchar(); 
    if(ch == '#') *T = NULL; 
    else{ 
        *T = (BiTNode *)malloc(sizeof(BiTNode)); 
        if(!(*T)) exit(-1); 
        (*T)->data = ch; 
        CreateBiTree( &(*T)->lchild ); 
        CreateBiTree( &(*T)->rchild ); 
    } 
}  
 
void DestroyBiTree(BiTree tree){ 
    //BiTree T; 
    //T = tree; 
    //if(tree->lchild) tree = tree->lchild; 
    //else tree = tree->rchild; 
    //free(T); 
    printf("Free tree.\n"); 
    free(tree); 
} 
void Destroy(BiTree T){ 
    if(T){ 
        if(T->lchild) 
            Destroy(T->lchild); 
        if(T->rchild) 
            Destroy(T->rchild); 
        printf("Free tree.\n"); 
        free(T);   
    } 
} 
              
void PreOrderTraverse(BiTree T, void(* Visit)(BiTree Tree) ){ 
    if(T){ 
        Visit(T); 
        PreOrderTraverse(T->lchild, Visit); 
        PreOrderTraverse(T->rchild, Visit); 
    }    
}  
 
void InOrderTraverse(BiTree T, void(* Visit)(BiTree Tree) ){ 
    if(T){ 
        PreOrderTraverse(T->lchild, Visit); 
        Visit(T); 
        PreOrderTraverse(T->rchild, Visit); 
    }    
} 
 
void PostOrderTraverse(BiTree T, void(* Visit)(BiTree Tree) ){ 
    if(T){ 
        PreOrderTraverse(T->lchild, Visit); 
        PreOrderTraverse(T->rchild, Visit); 
        Visit(T); 
    }    
} 
                
void PrintElement(BiTree T){ 
    printf("%3c", T->data); 
}  
                
int main() 
{ 
    BiTree tree1; 
 
    printf("Create tree:\n"); 
    CreateBiTree(&tree1); 
 
    printf("Pre Order Traverse tree:\n"); 
    PreOrderTraverse(tree1, PrintElement); 
     
    printf("\nIn Order Traverse tree:\n"); 
    InOrderTraverse(tree1, PrintElement); 
     
    printf("\nPost Order Traverse tree:\n"); 
    PostOrderTraverse(tree1, PrintElement); 
 
    printf("\nDestroy tree:\n"); 
    //PostOrderTraverse(tree1, DestroyBiTree);  
    Destroy(tree1);    
 
    system("pause"); 
    return 0; 
}