C語言數(shù)據(jù)結(jié)構(gòu)之二叉鏈表創(chuàng)建二叉樹
一、思想(先序思想創(chuàng)建)
第一步先創(chuàng)建根節(jié)點(diǎn),然后創(chuàng)建根節(jié)點(diǎn)左子樹,開始遞歸創(chuàng)建左子樹,直到遞歸創(chuàng)建到的節(jié)點(diǎn)下不繼續(xù)創(chuàng)建左子樹,也就是當(dāng)下遞歸到的節(jié)點(diǎn)下的左子樹指向NULL,結(jié)束本次左子樹遞歸,返回這個(gè)節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),開始創(chuàng)建右子樹,然后又開始以當(dāng)下這個(gè)節(jié)點(diǎn),繼續(xù)遞歸創(chuàng)建左子樹,左子樹遞歸創(chuàng)建完,就遞歸創(chuàng)建右子樹,直到遞歸結(jié)束返回到上一級指針節(jié)點(diǎn)(也就是根節(jié)點(diǎn)下),此時(shí)根節(jié)點(diǎn)左邊子樹創(chuàng)建完畢,開始創(chuàng)建右邊子樹,原理和根節(jié)點(diǎn)左邊創(chuàng)建左右子樹相同
二、創(chuàng)建二叉樹
二叉樹的操作通常使用遞歸方法,如果遞歸不太明白,建議去對此進(jìn)行一下學(xué)習(xí)和練習(xí)。二叉樹的操作可以分為兩類,一類是需要改變二叉樹的結(jié)構(gòu)的,比如二叉樹的創(chuàng)建、節(jié)點(diǎn)刪除等等,這類操作,傳入的二叉樹的節(jié)點(diǎn)參數(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)建左子樹和右子樹
二叉樹結(jié)構(gòu)體初始化:
為了更方便的使用二叉樹結(jié)構(gòu)體,可以使用 typedef 對結(jié)構(gòu)體進(jìn)行命名
typedef struct Tree{ ? ?int data;?? ??? ??? ??? ??? ?//?? ?存放數(shù)據(jù)域 ?struct Tree *lchild;?? ??? ??? ?//?? ?遍歷左子樹指針 ?struct Tree *rchild;?? ??? ??? ?//?? ?遍歷右子樹指針 ? }Tree,*BitTree;
這里展示兩種傳參類型的創(chuàng)建方法,其中深意可多次參考理解,加深指針理解
(1)傳一級參數(shù)方法
BitTree CreateLink() { ?? ?int data; ?? ?int temp; ?? ?BitTree T; ?? ? ?? ?scanf("%d",&data);?? ??? ?//?? ?輸入數(shù)據(jù) ?? ?temp=getchar();?? ??? ??? ?//?? ?吸收空格 ?? ? ?? ?if(data == -1){?? ??? ??? ?//?? ?輸入-1 代表此節(jié)點(diǎn)下子樹不存數(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("請輸入%d的左子樹: ",data);?? ??? ? ?? ??? ?T->lchild = CreateLink();?? ??? ??? ??? ??? ?//?? ??? ?開始遞歸創(chuàng)建左子樹 ?? ??? ?printf("請輸入%d的右子樹: ",data);?? ??? ??? ? ?? ??? ?T->rchild = CreateLink();?? ??? ??? ??? ??? ?//?? ??? ?開始到上一級節(jié)點(diǎn)的右邊遞歸創(chuàng)建左右子樹 ?? ??? ?return T;?? ??? ??? ??? ??? ??? ??? ?//?? ??? ?返回根節(jié)點(diǎn) ?? ?}?? ? ?? ? }
(2)傳二級參數(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));?? ??? ?//?? ?對指向節(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("請輸入%d的左子樹: ",data); ?? ??? ?CreateLink(&(*T)->lchild);?? ??? ?//?? ?開始遍歷左子樹 ?? ??? ?printf("請輸入%d的右子樹: ",data); ?? ??? ?CreateLink(&(*T)->rchild);?? ??? ?//?? ?開始遍歷右子樹,遍歷的思想文章開頭處解釋 ?? ??? ??? ? ?? ?}?? ? ?? ? }
(1)一級參數(shù)完整例子:
#include<stdio.h> #include<stdlib.h> typedef struct Tree{ ? ?int data;?? ??? ??? ??? ??? ?//?? ?存放數(shù)據(jù)域 ?struct Tree *lchild;?? ??? ??? ?//?? ?遍歷左子樹指針 ?struct Tree *rchild;?? ??? ??? ?//?? ?遍歷右子樹指針 ? }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ù)據(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("請輸入%d的左子樹: ",data);?? ??? ? ?? ??? ?T->lchild = CreateLink();?? ??? ??? ??? ??? ?//?? ??? ?開始遞歸創(chuàng)建左子樹 ?? ??? ?printf("請輸入%d的右子樹: ",data);?? ??? ??? ? ?? ??? ?T->rchild = CreateLink();?? ??? ??? ??? ??? ?//?? ??? ?開始到上一級節(jié)點(diǎn)的右邊遞歸創(chuàng)建左右子樹 ?? ??? ?return T;?? ??? ??? ??? ??? ??? ??? ?//?? ??? ?返回根節(jié)點(diǎn) ?? ?}?? ? ?? ? } void ShowXianXu(BitTree T)?? ??? ??? ?//?? ??? ?先序遍歷二叉樹 { ?? ?if(T==NULL) ?? ?{ ?? ??? ?return; ?? ?} ?? ?printf("%d ",T->data); ?? ?ShowXianXu(T->lchild);?? ??? ??? ?//?? ?遞歸遍歷左子樹 ?? ?ShowXianXu(T->rchild);?? ??? ??? ?//?? ?遞歸遍歷右子樹 } int main() { ?? ?BitTree S; ?? ?printf("請輸入第一個(gè)節(jié)點(diǎn)的數(shù)據(jù):\n"); ?? ?S = CreateLink();?? ??? ??? ?//?? ??? ?接受創(chuàng)建二叉樹完成的根節(jié)點(diǎn) ?? ?ShowXianXu(S);?? ??? ??? ??? ?//?? ??? ?先序遍歷二叉樹 ?? ? ?? ?return 0;?? ? }?
(2)二級參數(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));?? ??? ?//?? ?對指向節(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("請輸入%d的左子樹: ",data); ?? ??? ?CreateLink(&(*T)->lchild);?? ??? ?//?? ?開始遍歷左子樹 ?? ??? ?printf("請輸入%d的右子樹: ",data); ?? ??? ?CreateLink(&(*T)->rchild);?? ??? ?//?? ?開始遍歷右子樹,遍歷的思想文章開頭處解釋 ?? ??? ??? ? ?? ?}?? ? ?? ? } void ShowXianXu(BitTree T)?? ??? ?//?? ?先序遍歷二叉樹 { ?? ?if(T==NULL) ?? ?{ ?? ??? ?return; ?? ?} ?? ?printf("%d ",T->data); ?? ?ShowXianXu(T->lchild);?? ??? ?//?? ?遍歷左子樹 ?? ?ShowXianXu(T->rchild);?? ??? ?//?? ?遍歷右子樹 } int main() { ?? ?BitTree *S;?? ??? ??? ?//?? ?創(chuàng)建指向這個(gè)結(jié)構(gòu)體指針地址 的指針 ?? ?printf("請輸入第一個(gè)節(jié)點(diǎn)的數(shù)據(jù):\n"); ?? ?CreateLink(&S);?? ??? ?//?? ?傳二級指針地址 ?? ?ShowXianXu(S);?? ??? ? ?? ? ?? ?return 0;?? ? }?
到此這篇關(guān)于C語言數(shù)據(jù)結(jié)構(gòu)之 二叉鏈表創(chuàng)建二叉樹的文章就介紹到這了,更多相關(guān)C語言 二叉鏈表創(chuàng)建二叉樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言控制臺實(shí)現(xiàn)字符飛機(jī)大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了C語言控制臺實(shí)現(xiàn)字符飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12淺談c++構(gòu)造函數(shù)問題,初始化和賦值問題
下面小編就為大家?guī)硪黄獪\談c++構(gòu)造函數(shù)問題,初始化和賦值問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12C++高級數(shù)據(jù)結(jié)構(gòu)之二叉查找樹
這篇文章主要介紹了C++高級數(shù)據(jù)結(jié)構(gòu)之二叉查找樹,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05C++實(shí)現(xiàn)LeetCode(309.買股票的最佳時(shí)間含冷凍期)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(309.買股票的最佳時(shí)間含冷凍期),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08詳解C++中二進(jìn)制求補(bǔ)運(yùn)算符與下標(biāo)運(yùn)算符的用法
這篇文章主要介紹了C++中二進(jìn)制求補(bǔ)運(yùn)算符與下標(biāo)運(yùn)算符的用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2016-01-01C語言詳解用char實(shí)現(xiàn)大小寫字母的轉(zhuǎn)換
這篇文章主要給大家介紹了關(guān)于C語言實(shí)現(xiàn)大小寫字母轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05