1. 程式人生 > >二叉樹的鏈式儲存結構及實現(C語言完整程式碼+詳細註釋)

二叉樹的鏈式儲存結構及實現(C語言完整程式碼+詳細註釋)

鏈式儲存結構儲存二叉樹,實際上就是採用連結串列儲存二叉樹。

既然是使用連結串列,首先需要構建連結串列中節點的結構。考慮到儲存物件為二叉樹,其各個節點最多包含 3 部分,依次是:左孩子、節點資料和右孩子,因此,連結串列的每個節點都由這 3 部分組成:


圖 1 二叉連結串列結點構成
圖 1 中,Lchild 代表指向左孩子的指標域;data 為資料域;Rchild 代表指向右孩子的指標域。使用此種結點構建的二叉樹稱為“二叉連結串列”

結點結構用程式碼表示為:
typedef struct BiTNode{
    TElemType data;//資料域
    struct BiTNode *lchild,*rchild;//左右孩子指標
}BiTNode,*BiTree;
如果後期再使用連結串列的過程中需要頻繁地訪問某結點的父結點,可以在構建連結串列時使用下面這種結點結構:


圖 2 三叉連結串列結點構成
圖 2 中,Lchild 指向左孩子;Rchild 指向右孩子;data 為資料域;parent 指向父結點。使用這種結構的結點建立的樹稱為“三叉連結串列”

結點結構程式碼表示:
typedef struct BiTNode{
    TElemType data;//資料域
    struct BiTNode *lchild,*rchild;//左右孩子指標
    struct BiTNode *parent;
}BiTNode,*BiTree;
例如,下圖為分別用以上兩種節點結構構建的二叉樹:
 

圖 3 單支樹示意圖
圖 3 中二叉連結串列的C語言實現程式碼如下:
#include <stdio.h>
#include <stdlib.h>
#define TElemType int

typedef struct BiTNode{
    TElemType data;//資料域
    struct BiTNode *lchild,*rchild;//左右孩子指標
}BiTNode,*BiTree;

void CreateBiTree(BiTree *T){
    *T=(BiTNode*)malloc(sizeof(BiTNode));
    (*T)->data=1;
    (*T)->lchild=(BiTNode*)malloc(sizeof(BiTNode));
    (*T)->rchild=NULL;
    (*T)->lchild->data=2;            
    (*T)->lchild->lchild=(BiTNode*)malloc(sizeof(BiTNode));
    (*T)->lchild->rchild=NULL;
    (*T)->lchild->lchild->data=3;
    (*T)->lchild->lchild->lchild=NULL;
    (*T)->lchild->lchild->rchild=NULL;
}
int main() {
    BiTree Tree;
    CreateBiTree(&Tree);
    printf("%d",Tree->lchild->lchild->data);
    return 0;
}
執行結果: 3