1. 程式人生 > >C語言構造並遞迴遍歷二叉樹

C語言構造並遞迴遍歷二叉樹

#include<stdio.h>
#include<malloc.h>

#define FALSE 1
#define ERROR 0
#define OK 1
#define ON 0

typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;

typedef int Status;
BiTree T;

Status CreateBiTree(BiTree *T)
{
    char ch;
    scanf("%c",&ch);
    if (ch==' ')
        *T = NULL;
    else
    {
        if (!((*T) = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;
        (*T)->data = ch;
        CreateBiTree(&((*T)->lchild));   // 構造左子樹
        CreateBiTree(&((*T)->rchild));   // 構造右子樹
    }
    return OK;
} // CreateBiTree

int vi(char c)
{
    printf("%c ",c);
    return OK;
}

//先序遍歷的遞迴
void PreOrder(BiTree T)
{
    if(T)
    {
        vi(T->data);      //訪問結點
        PreOrder(T->lchild);       //遍歷左子樹
        PreOrder(T->rchild);       //遍歷右子樹
    }
}

//中序遍歷的遞迴
void InOrder(BiTree T)
{
    // 採用二叉連結串列儲存結構,Visit是對資料元素操作的應用函式。
    // 中序遍歷二叉樹T的遞迴演算法,對每個資料元素呼叫函式Visit。
    if(T)
    {
    InOrder(T->lchild);
    vi(T->data);
    InOrder(T->rchild);
    }
} // InOrderTraverse

//後序遍歷的遞迴
void PostOrder(BiTree T)
{
    // 採用二叉連結串列儲存結構,Visit是對資料元素操作的應用函式。
    // 中序遍歷二叉樹T的遞迴演算法,對每個資料元素呼叫函式Visit。
    if(T)
    {
    PostOrder(T->lchild);
    PostOrder(T->rchild);
    vi(T->data);
    }
} // InOrderTraverse
int main()
{
    printf("先序輸入二叉樹(空格代表空節點):\n");
    CreateBiTree(&T);
    printf("先序輸出二叉樹:\n");
    PreOrder(T);
    printf("\n");
    printf("中序輸出二叉樹:\n");
    InOrder(T);
    printf("\n");
    printf("後序輸出二叉樹:\n");
    PostOrder(T);
    printf("\n");
    return 0;
}

執行結果: