C語言描述二叉樹的實現及操作(鏈表實現)



概述

     二叉樹為每個節點最多有兩個兒子節點(左兒子節點和右兒子節點)的樹。

  前序遍歷:根結點 ---> 左子樹 ---> 右子樹。

  中序遍歷:左子樹---> 根結點 ---> 右子樹。

  后序遍歷:左子樹 ---> 右子樹 ---> 根結點。

  節點深度:節點ni的深度(depth)為從根到ni的唯一路徑的長。根的深度為0。

  節點的高:節點ni的高(height)為從ni到一片樹葉的最長路徑。所有的樹葉(沒有兒子節點的節點)的高都為0。一棵樹的高等於它的根的高。 

代碼實現 

  

//    二叉樹的實現(C語言)
//    鏈表,遞歸實現
//    編譯環境:visual studio 2017
//    操作系統:win8.1

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

typedef char Elementtype;    //    定義數據類型,可根據需要自行定制
typedef struct TreeNode * Node;    //    Node相當於struct treeNode *
//    定義數節點結構
typedef struct TreeNode {
    Elementtype Element;
    Node left;    //    樹節點的左子節點
    Node right;    //    樹節點的右子節點
}TREE,*PTREE;

//    函數聲明
void CreatTree(PTREE *);    //    樹的先序創建函數
void PreOrderTree(PTREE );    //    樹的前序遍歷函數
void InOrderTree(PTREE );    //    樹的中序遍歷
void PostOrderTree(PTREE );    //    樹的后序遍歷
void LeafOfTree(PTREE );    //    打印樹的葉子節點函數
int  Get_Leaf_Num(PTREE );    //    獲取樹葉子節點個數
int Get_Height(PTREE );    //    獲取樹的高度


//    主函數
int main() {
    
    PTREE Root;    
    printf("請先序輸入二叉樹的節點數據: ");
    CreatTree(&Root);    
    printf("\n前序遍歷結果為:");
    PreOrderTree(Root);    
    printf("\n中序遍歷結果為:");
    InOrderTree(Root);
    printf("\n后序遍歷結果為:");
    PostOrderTree(Root);
    printf("\n打印葉子節點為:");
    LeafOfTree(Root);
    printf("\n葉子節點個數為:%d", Get_Leaf_Num(Root));
    printf("\n二叉樹的高度為:%d", Get_Height(Root));
    printf("\n");

    return 0;
}

//    定義樹先序創建函數
void CreatTree(PTREE *Root) {
    char val=0;    //    用於下面存放數據
    val=getchar();    //    輸入數據值
    //    如果輸入'*',則指向為空
    if (val == '*')
        (*Root) = NULL;
    //    如果輸入非'*',則給數據域賦值
    else {
        (*Root) = (PTREE)malloc(sizeof(TREE));    //    申請內存空間
        if ((*Root) == NULL) {
            printf("創建節點失敗,無法分配可用內存...");
            exit(-1);
        }
        else {
            (*Root)->Element = val;    //    給節點數據域賦值
            CreatTree(&(*Root)->left);
            CreatTree(&(*Root)->right);
        }
    }
    
}
//    樹的前序遍歷函數定義
void PreOrderTree(PTREE Root) {

    if (Root == NULL)
        return;
    else {
        putchar(Root->Element);
        PreOrderTree(Root->left);
        PreOrderTree(Root->right);

    }
}
//    樹的中序遍歷函數定義
void InOrderTree(PTREE Root) {

    if (Root == NULL)
        return;
    else {
        InOrderTree(Root->left);
        putchar(Root->Element);
        InOrderTree(Root->right);

    }
}

//    樹的后序遍歷函數定義
void PostOrderTree(PTREE Root) {

    if (Root==NULL) 
        return ;
    else{
        PostOrderTree(Root->left);
        PostOrderTree(Root->right);
        putchar( Root->Element);
    }
}



//    打印樹的葉子節點函數定義
void LeafOfTree(PTREE Tree) {
    if (Tree == NULL)    
        return ;

    else {
        if (Tree->left == NULL&&Tree->right == NULL)
            putchar(Tree->Element);
        else {
            LeafOfTree(Tree->left);
            LeafOfTree(Tree->right);
        }
    }
        
}

//    獲取樹的葉子節點個數函數定義
int Get_Leaf_Num(PTREE Tree) {
    if (Tree == NULL)
        return 0;
    if (Tree->left == NULL&&Tree->right == NULL)
        return 1;
    //遞歸整個樹的葉子節點個數 = 左子樹葉子節點的個數 + 右子樹葉子節點的個數
    return Get_Leaf_Num(Tree->left) + Get_Leaf_Num(Tree->right);
}
//    獲取樹高的函數定義
int Get_Height(PTREE Tree) {
    int Height = 0;
    if (Tree == NULL)
        return 0;
    
    //樹的高度 = max(左子樹的高度,右子樹的高度) + 1
    else
    {
        int L_Height = Get_Height(Tree->left);
        int R_Height = Get_Height(Tree->right);
        Height = L_Height >= R_Height ? L_Height + 1 : R_Height + 1;
    }
    return Height;
}

運行結果


免責聲明!

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



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