C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之二叉鏈表創(chuàng)建二叉樹(shù)
一、思想(先序思想創(chuàng)建)
第一步先創(chuàng)建根節(jié)點(diǎn),然后創(chuàng)建根節(jié)點(diǎn)左子樹(shù),開(kāi)始遞歸創(chuàng)建左子樹(shù),直到遞歸創(chuàng)建到的節(jié)點(diǎn)下不繼續(xù)創(chuàng)建左子樹(shù),也就是當(dāng)下遞歸到的節(jié)點(diǎn)下的左子樹(shù)指向NULL,結(jié)束本次左子樹(shù)遞歸,返回這個(gè)節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),開(kāi)始創(chuàng)建右子樹(shù),然后又開(kāi)始以當(dāng)下這個(gè)節(jié)點(diǎn),繼續(xù)遞歸創(chuàng)建左子樹(shù),左子樹(shù)遞歸創(chuàng)建完,就遞歸創(chuàng)建右子樹(shù),直到遞歸結(jié)束返回到上一級(jí)指針節(jié)點(diǎn)(也就是根節(jié)點(diǎn)下),此時(shí)根節(jié)點(diǎn)左邊子樹(shù)創(chuàng)建完畢,開(kāi)始創(chuàng)建右邊子樹(shù),原理和根節(jié)點(diǎn)左邊創(chuàng)建左右子樹(shù)相同
二、創(chuàng)建二叉樹(shù)
二叉樹(shù)的操作通常使用遞歸方法,如果遞歸不太明白,建議去對(duì)此進(jìn)行一下學(xué)習(xí)和練習(xí)。二叉樹(shù)的操作可以分為兩類,一類是需要改變二叉樹(shù)的結(jié)構(gòu)的,比如二叉樹(shù)的創(chuàng)建、節(jié)點(diǎn)刪除等等,這類操作,傳入的二叉樹(shù)的節(jié)點(diǎn)參數(shù)為二叉樹(shù)指針的地址,這種參入傳入,便于更改二叉樹(shù)結(jié)構(gòu)體的指針(即地址)。這里稍微有一點(diǎn)點(diǎn)繞,可能需要多思考一下
如下是二叉數(shù)創(chuàng)建的函數(shù),這里我規(guī)定,節(jié)點(diǎn)值為整數(shù),如果輸入的數(shù)為-1,則表示結(jié)束繼續(xù)往下創(chuàng)建子節(jié)點(diǎn)的操作。然后我們使用遞歸的方法以此創(chuàng)建左子樹(shù)和右子樹(shù)
二叉樹(shù)結(jié)構(gòu)體初始化:
為了更方便的使用二叉樹(shù)結(jié)構(gòu)體,可以使用 typedef 對(duì)結(jié)構(gòu)體進(jìn)行命名
typedef struct Tree{
?
?int data;?? ??? ??? ??? ??? ?//?? ?存放數(shù)據(jù)域
?struct Tree *lchild;?? ??? ??? ?//?? ?遍歷左子樹(shù)指針
?struct Tree *rchild;?? ??? ??? ?//?? ?遍歷右子樹(shù)指針
?
}Tree,*BitTree;這里展示兩種傳參類型的創(chuàng)建方法,其中深意可多次參考理解,加深指針理解
(1)傳一級(jí)參數(shù)方法
BitTree CreateLink()
{
?? ?int data;
?? ?int temp;
?? ?BitTree T;
?? ?
?? ?scanf("%d",&data);?? ??? ?//?? ?輸入數(shù)據(jù)
?? ?temp=getchar();?? ??? ??? ?//?? ?吸收空格
?? ?
?? ?if(data == -1){?? ??? ??? ?//?? ?輸入-1 代表此節(jié)點(diǎn)下子樹(shù)不存數(shù)據(jù),也就是不繼續(xù)遞歸創(chuàng)建
?? ??? ?
?? ??? ?return NULL;
?? ?}else{
?? ??? ?T = (BitTree)malloc(sizeof(Tree));?? ??? ??? ?//?? ??? ?分配內(nèi)存空間
?? ??? ?T->data = data;?? ??? ??? ??? ??? ??? ??? ??? ?//?? ??? ?把當(dāng)前輸入的數(shù)據(jù)存入當(dāng)前節(jié)點(diǎn)指針的數(shù)據(jù)域中
?? ??? ?
?? ??? ?printf("請(qǐng)輸入%d的左子樹(shù): ",data);?? ??? ?
?? ??? ?T->lchild = CreateLink();?? ??? ??? ??? ??? ?//?? ??? ?開(kāi)始遞歸創(chuàng)建左子樹(shù)
?? ??? ?printf("請(qǐng)輸入%d的右子樹(shù): ",data);?? ??? ??? ?
?? ??? ?T->rchild = CreateLink();?? ??? ??? ??? ??? ?//?? ??? ?開(kāi)始到上一級(jí)節(jié)點(diǎn)的右邊遞歸創(chuàng)建左右子樹(shù)
?? ??? ?return T;?? ??? ??? ??? ??? ??? ??? ?//?? ??? ?返回根節(jié)點(diǎn)
?? ?}?? ?
?? ?
}
(2)傳二級(jí)參數(shù)方法
BitTree CreateLink(BitTree *T)?? ??? ?//?? ?次數(shù) T為指向根節(jié)點(diǎn)的指針的地址
{
?? ?int data;?? ?
?? ?
?? ?scanf("%d",&data);
?? ?
?? ?if(data == -1){
?? ??? ?
?? ??? ?*T=NULL;?? ??? ??? ??? ?//?? ?結(jié)束遞歸時(shí),讓指針當(dāng)前節(jié)點(diǎn)的指針地址的 指針 指向NULL
?? ?}else{
?? ??? ?
?? ??? ?*T = (BitTree)malloc(sizeof(Tree));?? ??? ?//?? ?對(duì)指向節(jié)點(diǎn)指針地址的指針 分配內(nèi)存
?? ?
?? ??? ?if(!(*T) ){?? ??? ??? ?//?? ?*T = NULL ?表示分配內(nèi)存失敗,也就是結(jié)束遞歸創(chuàng)建了
?? ??? ??? ?printf("內(nèi)存分配失敗\n");
?? ??? ??? ?exit(-1);
?? ??? ?}
?? ??? ?
?? ??? ?
?? ??? ?(*T)->data = data;?? ??? ?//?? ?給節(jié)點(diǎn)指針地址內(nèi)的數(shù)據(jù)域,存入數(shù)據(jù)
?? ??? ?
?? ??? ?printf("請(qǐng)輸入%d的左子樹(shù): ",data);
?? ??? ?CreateLink(&(*T)->lchild);?? ??? ?//?? ?開(kāi)始遍歷左子樹(shù)
?? ??? ?printf("請(qǐng)輸入%d的右子樹(shù): ",data);
?? ??? ?CreateLink(&(*T)->rchild);?? ??? ?//?? ?開(kāi)始遍歷右子樹(shù),遍歷的思想文章開(kāi)頭處解釋
?? ??? ??? ?
?? ?}?? ?
?? ?
}
(1)一級(jí)參數(shù)完整例子:
#include<stdio.h>
#include<stdlib.h>
typedef struct Tree{
?
?int data;?? ??? ??? ??? ??? ?//?? ?存放數(shù)據(jù)域
?struct Tree *lchild;?? ??? ??? ?//?? ?遍歷左子樹(shù)指針
?struct Tree *rchild;?? ??? ??? ?//?? ?遍歷右子樹(shù)指針
?
}Tree,*BitTree;
BitTree CreateLink()
{
?? ?int data;
?? ?int temp;
?? ?BitTree T;
?? ?
?? ?scanf("%d",&data);?? ??? ?//?? ?輸入數(shù)據(jù)
?? ?temp=getchar();?? ??? ??? ?//?? ?吸收空格
?? ?
?? ?if(data == -1){?? ??? ??? ?//?? ?輸入-1 代表此節(jié)點(diǎn)下子樹(shù)不存數(shù)據(jù),也就是不繼續(xù)遞歸創(chuàng)建
?? ??? ?
?? ??? ?return NULL;
?? ?}else{
?? ??? ?T = (BitTree)malloc(sizeof(Tree));?? ??? ??? ?//?? ??? ?分配內(nèi)存空間
?? ??? ?T->data = data;?? ??? ??? ??? ??? ??? ??? ??? ?//?? ??? ?把當(dāng)前輸入的數(shù)據(jù)存入當(dāng)前節(jié)點(diǎn)指針的數(shù)據(jù)域中
?? ??? ?
?? ??? ?printf("請(qǐng)輸入%d的左子樹(shù): ",data);?? ??? ?
?? ??? ?T->lchild = CreateLink();?? ??? ??? ??? ??? ?//?? ??? ?開(kāi)始遞歸創(chuàng)建左子樹(shù)
?? ??? ?printf("請(qǐng)輸入%d的右子樹(shù): ",data);?? ??? ??? ?
?? ??? ?T->rchild = CreateLink();?? ??? ??? ??? ??? ?//?? ??? ?開(kāi)始到上一級(jí)節(jié)點(diǎn)的右邊遞歸創(chuàng)建左右子樹(shù)
?? ??? ?return T;?? ??? ??? ??? ??? ??? ??? ?//?? ??? ?返回根節(jié)點(diǎn)
?? ?}?? ?
?? ?
}
void ShowXianXu(BitTree T)?? ??? ??? ?//?? ??? ?先序遍歷二叉樹(shù)
{
?? ?if(T==NULL)
?? ?{
?? ??? ?return;
?? ?}
?? ?printf("%d ",T->data);
?? ?ShowXianXu(T->lchild);?? ??? ??? ?//?? ?遞歸遍歷左子樹(shù)
?? ?ShowXianXu(T->rchild);?? ??? ??? ?//?? ?遞歸遍歷右子樹(shù)
}
int main()
{
?? ?BitTree S;
?? ?printf("請(qǐng)輸入第一個(gè)節(jié)點(diǎn)的數(shù)據(jù):\n");
?? ?S = CreateLink();?? ??? ??? ?//?? ??? ?接受創(chuàng)建二叉樹(shù)完成的根節(jié)點(diǎn)
?? ?ShowXianXu(S);?? ??? ??? ??? ?//?? ??? ?先序遍歷二叉樹(shù)
?? ?
?? ?return 0;?? ?
}?
(2)二級(jí)參數(shù)完整例子
#include<stdio.h>
#include<stdlib.h>
typedef struct Tree{
?? ?
?? ?int data;
?? ?struct Tree *lchild;
?? ?struct Tree *rchild;
}Tree,*BitTree;
BitTree CreateLink(BitTree *T)?? ??? ?//?? ?次數(shù) T為指向根節(jié)點(diǎn)的指針的地址
{
?? ?int data;?? ?
?? ?
?? ?scanf("%d",&data);
?? ?
?? ?if(data == -1){
?? ??? ?
?? ??? ?*T=NULL;?? ??? ??? ??? ?//?? ?結(jié)束遞歸時(shí),讓指針當(dāng)前節(jié)點(diǎn)的指針地址的 指針 指向NULL
?? ?}else{
?? ??? ?
?? ??? ?*T = (BitTree)malloc(sizeof(Tree));?? ??? ?//?? ?對(duì)指向節(jié)點(diǎn)指針地址的指針 分配內(nèi)存
?? ?
?? ??? ?if(!(*T) ){?? ??? ??? ?//?? ?*T = NULL ?表示分配內(nèi)存失敗,也就是結(jié)束遞歸創(chuàng)建了
?? ??? ??? ?printf("內(nèi)存分配失敗\n");
?? ??? ??? ?exit(-1);
?? ??? ?}
?? ??? ?
?? ??? ?
?? ??? ?(*T)->data = data;?? ??? ?//?? ?給節(jié)點(diǎn)指針地址內(nèi)的數(shù)據(jù)域,存入數(shù)據(jù)
?? ??? ?
?? ??? ?printf("請(qǐng)輸入%d的左子樹(shù): ",data);
?? ??? ?CreateLink(&(*T)->lchild);?? ??? ?//?? ?開(kāi)始遍歷左子樹(shù)
?? ??? ?printf("請(qǐng)輸入%d的右子樹(shù): ",data);
?? ??? ?CreateLink(&(*T)->rchild);?? ??? ?//?? ?開(kāi)始遍歷右子樹(shù),遍歷的思想文章開(kāi)頭處解釋
?? ??? ??? ?
?? ?}?? ?
?? ?
}
void ShowXianXu(BitTree T)?? ??? ?//?? ?先序遍歷二叉樹(shù)
{
?? ?if(T==NULL)
?? ?{
?? ??? ?return;
?? ?}
?? ?printf("%d ",T->data);
?? ?ShowXianXu(T->lchild);?? ??? ?//?? ?遍歷左子樹(shù)
?? ?ShowXianXu(T->rchild);?? ??? ?//?? ?遍歷右子樹(shù)
}
int main()
{
?? ?BitTree *S;?? ??? ??? ?//?? ?創(chuàng)建指向這個(gè)結(jié)構(gòu)體指針地址 的指針
?? ?printf("請(qǐng)輸入第一個(gè)節(jié)點(diǎn)的數(shù)據(jù):\n");
?? ?CreateLink(&S);?? ??? ?//?? ?傳二級(jí)指針地址
?? ?ShowXianXu(S);?? ??? ?
?? ?
?? ?return 0;?? ?
}?到此這篇關(guān)于C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之 二叉鏈表創(chuàng)建二叉樹(shù)的文章就介紹到這了,更多相關(guān)C語(yǔ)言 二叉鏈表創(chuàng)建二叉樹(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
實(shí)例分析一個(gè)簡(jiǎn)單的Win32程序
這篇文章主要介紹了實(shí)例分析一個(gè)簡(jiǎn)單的Win32程序,對(duì)于Win32應(yīng)用程序的原理、執(zhí)行流程、實(shí)現(xiàn)方法主要環(huán)節(jié)都做了較為詳細(xì)的分析,有助于讀者深入理解Windows應(yīng)用程序設(shè)計(jì),需要的朋友可以參考下2014-09-09
C語(yǔ)言實(shí)現(xiàn)時(shí)間處理工具的示例代碼
這篇文章主要為大家詳細(xì)介紹了利用C語(yǔ)言實(shí)現(xiàn)時(shí)間處理工具的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-09-09
C++中引用的相關(guān)知識(shí)點(diǎn)小結(jié)
引用是C++一個(gè)很重要的特性,顧名思義是某一個(gè)變量或?qū)ο蟮膭e名,對(duì)引用的操作與對(duì)其所綁定的變量或?qū)ο蟮牟僮魍耆葍r(jià),這篇文章主要給大家總結(jié)介紹了C++中引用的相關(guān)知識(shí)點(diǎn),需要的朋友可以參考下2022-03-03
C語(yǔ)言實(shí)現(xiàn)飛機(jī)訂票系統(tǒng)的完整代碼
為了免去在窗口排隊(duì)買(mǎi)票的麻煩,飛機(jī)訂票系統(tǒng)應(yīng)運(yùn)而生,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言實(shí)現(xiàn)飛機(jī)訂票系統(tǒng)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06

