C語言實現二叉樹的基本操作


       我在前面的博客中解說了鏈表、棧和隊列。這些數據結構事實上都是線性表,而且給出了具體的實現。

從今天開始。我們將要來學習樹,樹作為一種數據結構我們常常會用到,作為起步和基礎。我們先來實現二叉樹。也就是每一個節點有不超過2個子節點的樹。對於樹的操作,最主要的創建、遍歷、求樹高、節點數等。代碼上傳至 https://github.com/chenyufeng1991/BinaryTree 。

(1)節點的定義

typedef struct BTNode{
    int data;
    struct BTNode *lChild;
    struct BTNode *rChild;
}BiTNode;


(2)二叉樹的創建

//先序創建二叉樹
int CreateBiTree(BiTNode **T)
{
    int ch;
    scanf("%d",&ch);
    if (ch == -1)
    {
        *T = NULL;
        return 0;
    }
    else
    {
        *T = (BiTNode *)malloc(sizeof(BiTNode));
        if (T == NULL)
        {
            printf("failed\n");
            return 0;
        }
        else
        {
            (*T)->data = ch;
            printf("輸入%d的左子節點:",ch);
            CreateBiTree(&((*T)->lChild));
            printf("輸入%d的右子節點:",ch);
            CreateBiTree((&(*T)->rChild));
        }
    }

    return 1;
}



(3)先序遍歷二叉樹

//先序遍歷二叉樹
void PreOrderBiTree(BiTNode *T)
{
    if (T == NULL)
    {
        return;
    }
    else
    {
        printf("%d ",T->data);
        PreOrderBiTree(T->lChild);
        PreOrderBiTree(T->rChild);
    }
}



(4)中序遍歷二叉樹

//中序遍歷二叉樹
void MiddleOrderBiTree(BiTNode *T)
{
    if (T == NULL)
    {
        return;
    }
    else
    {
        MiddleOrderBiTree(T->lChild);
        printf("%d ",T->data);
        MiddleOrderBiTree(T->rChild);
    }
}



(5)興許遍歷二叉樹

//興許遍歷二叉樹
void PostOrderBiTree(BiTNode *T)
{
    if (T == NULL)
    {
        return;
    }
    else
    {
        PostOrderBiTree(T->lChild);
        PostOrderBiTree(T->rChild);
        printf("%d ",T->data);
    }
}



(6)二叉樹的深度

//二叉樹的深度
int TreeDeep(BiTNode *T)
{
    int deep = 0;
    if (T != NULL)
    {
        int leftdeep = TreeDeep(T->lChild);
        int rightdeep = TreeDeep(T->rChild);
        deep = leftdeep >= rightdeep?leftdeep+1:rightdeep+1;
    }

    return deep;
}



(7)葉子節點個數

//葉子節點個數
int LeafCount(BiTNode *T)
{
    static int count;
    if (T != NULL)
    {
        if (T->lChild == NULL && T->rChild == NULL)
        {
            count++;
        }

        LeafCount(T->lChild);
        LeafCount(T->rChild);
    }

    return count;
}



(8)測試函數

//主函數
int main(int argc,const char *argv[])
{
    BiTNode *T;
    int depth,leafCount = 0;
    printf("請輸入第一個節點的值,-1表示沒有葉節點:\n");
    CreateBiTree(&T);

    printf("先序遍歷二叉樹:");
    PreOrderBiTree(T);
    printf("\n");

    printf("中序遍歷二叉樹:");
    MiddleOrderBiTree(T);
    printf("\n");

    printf("興許遍歷二叉樹:");
    PostOrderBiTree(T);
    printf("\n");

    depth = TreeDeep(T);
    printf("樹的深度為:%d\n",depth);
    
    leafCount = LeafCount(T);
    printf("葉子節點個數:%d\n",leafCount);

    return 0;
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM