二叉樹的建立和遍歷(C語言實(shí)現(xiàn))

二叉樹

二叉樹結(jié)構(gòu)的定義

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

二叉樹的建立

按照前序擴(kuò)展二叉樹輸入

void CreatBiTree(BiTree* T) 
{
    TElemType ch;
    scanf("%c",&ch);
    if(ch == '#')
    {
        *T = NULL;  //如果輸入為#就將結(jié)點(diǎn)的地址設(shè)為NULL 
    }
    else
    {
        *T = (BiTree) malloc(sizeof(BiTNode));
        if(!T)
        {
            exit(OVERFLOW);
        }
        (*T)->data = ch;
        CreatBiTree(&(*T)->lchild);
        CreatBiTree(&(*T)->rchild);
    }
}

在敲這段代碼的時候,我一直有一個疑惑,就是問什么它這個地方要傳入雙重指針,所以我寫的時候就把他改成使用指針變量,而不是雙重指針,寫好之后,在輸出的時候出現(xiàn)了錯誤,發(fā)現(xiàn)值并沒有傳入到二叉樹當(dāng)中,之后又改成原來的版本,使用雙重指針,錯誤就好了,這應(yīng)該是形參和實(shí)參的問題,有點(diǎn)迷糊,還是要多看書……

還有一個問題就是在你創(chuàng)建的輸入的時候不能一個一個的字符輸入,而是只能一次性全部輸完,他才會跳出循環(huán),現(xiàn)在還不知道原因……

二叉樹的遍歷(遞歸實(shí)現(xiàn))

前序遍歷

void PreOrderTraverse(BiTree T)
{
    if(!T)
    {
        return;
    }
    printf("%c",T->data);
    PreOrderTraverse(T->lchild);
    PreOrderTraverse(T->rchild);
}

中序遍歷

void InOrderTraverse(BiTree T)
{
    if(!T)
    {
        return;
    }
    InOrderTraverse(T->lchild);
    printf("%c",T->data);
    InOrderTraverse(T->rchild);
}

后序遍歷

void PostOrderTraverse(BiTree T)
{
    if(!T)
    {
        return;
    }
    PostOrderTraverse(T->lchild);
    PostOrderTraverse(T->rchild);
    printf("%c",T->data);
}

實(shí)驗(yàn)結(jié)果

完整的代碼

/*二叉樹*/

#include <stdio.h>
#include <stdlib.h>

#define OVERFLOW 0
typedef char TElemType;

//定義樹的結(jié)點(diǎn)的結(jié)構(gòu),BiTree結(jié)點(diǎn)的指針變量 
typedef struct BiTNode {
    TElemType data;
    struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

void CreatBiTree(BiTree* T) 
{
    TElemType ch;
    scanf("%c",&ch);
    if(ch == '#')
    {
        *T = NULL;  //如果輸入為#就將結(jié)點(diǎn)的地址設(shè)為NULL 
    }
    else
    {
        *T = (BiTree) malloc(sizeof(BiTNode));
        if(!T)
        {
            exit(OVERFLOW);
        }
        (*T)->data = ch;
        CreatBiTree(&(*T)->lchild);
        CreatBiTree(&(*T)->rchild);
    }
}

//前序遍歷的遞歸實(shí)現(xiàn) 
void PreOrderTraverse(BiTree T)
{
    if(!T)
    {
        return;
    }
    printf("%c",T->data);
    PreOrderTraverse(T->lchild);
    PreOrderTraverse(T->rchild);
}

//中序遍歷的遞歸實(shí)現(xiàn) 
void InOrderTraverse(BiTree T)
{
    if(!T)
    {
        return;
    }
    InOrderTraverse(T->lchild);
    printf("%c",T->data);
    InOrderTraverse(T->rchild);
}

//后續(xù)遍歷的遞歸實(shí)現(xiàn) 
void PostOrderTraverse(BiTree T)
{
    if(!T)
    {
        return;
    }
    PostOrderTraverse(T->lchild);
    PostOrderTraverse(T->rchild);
    printf("%c",T->data);
}

int main()
{
    printf("請按照前序擴(kuò)展二叉樹進(jìn)行輸入:"); 
    BiTree t;
    CreatBiTree(&t);
    printf("二叉樹建立成功!??!\n");
    printf("前序遍歷:"); 
    PreOrderTraverse(t);
    printf("\n");
    printf("中序遍歷:"); 
    InOrderTraverse(t);
    printf("\n");
    printf("后序遍歷:"); 
    PostOrderTraverse(t);
    printf("\n");
    
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容