樹(C語言)

一映企、定義

有且只有1個(gè)稱為根的節(jié)點(diǎn)悟狱;
有若干個(gè)互不相交的子樹,這些子樹本身也是一棵樹堰氓。

樹由節(jié)點(diǎn)和邊(指針域)組成挤渐。
每個(gè)節(jié)點(diǎn)只有一個(gè)父節(jié)點(diǎn),但可以有多個(gè)子節(jié)點(diǎn)双絮;
但有一個(gè)節(jié)點(diǎn)例外浴麻,該節(jié)點(diǎn)沒有父節(jié)點(diǎn),此節(jié)點(diǎn)稱為根節(jié)點(diǎn)囤攀。


二软免、專業(yè)術(shù)語

1、節(jié)點(diǎn)
2抚岗、父節(jié)點(diǎn)
3或杠、子節(jié)點(diǎn)
4、子孫
5宣蔚、堂兄弟
6、深度:從根節(jié)點(diǎn)到最底層節(jié)點(diǎn)的層數(shù)认境。
根節(jié)點(diǎn)是第1層胚委。
7、葉子節(jié)點(diǎn):沒有子節(jié)點(diǎn)的節(jié)點(diǎn)叉信。
8亩冬、非終端節(jié)點(diǎn)/非葉子節(jié)點(diǎn):有子節(jié)點(diǎn)的節(jié)點(diǎn)。
根節(jié)點(diǎn)既可以是葉子節(jié)點(diǎn),也可以是非葉子節(jié)點(diǎn)硅急。
9覆享、節(jié)點(diǎn)的度:子節(jié)點(diǎn)的個(gè)數(shù)。
樹的度:節(jié)點(diǎn)的度中最大的度稱為樹的度营袜。


三撒顿、樹的分類

一般樹:任意一個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)的個(gè)數(shù)都不受限制。

二叉樹:任意一個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)的個(gè)數(shù)最多2個(gè)荚板,且子節(jié)點(diǎn)的位置不可更改凤壁。

二叉樹的分類:

  • 一般二叉樹
  • 滿二叉樹:在不增加樹的層數(shù)的前提下,無法再多添加一個(gè)節(jié)點(diǎn)的二叉樹是滿二叉樹跪另。
  • 完全二叉樹:如果只是刪除了滿二叉樹最底層拧抖、最右邊的連續(xù)若干個(gè)節(jié)點(diǎn),這樣形成的二叉樹就是完全二叉樹免绿。

完全二叉樹的優(yōu)點(diǎn):
查找某個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)和子節(jié)點(diǎn)(也包括判斷有沒有子節(jié)點(diǎn))的速度很快唧席;

滿二叉樹是完全二叉樹的一個(gè)特例;完全二叉樹包含滿二叉樹嘲驾。

森林:n個(gè)互不相交的樹的集合袱吆。


四、樹的存儲(chǔ)

1距淫、二叉樹的存儲(chǔ):

連續(xù)存儲(chǔ)[完全二叉樹]:

要以數(shù)組方式來存绞绒,必須先轉(zhuǎn)化成完全二叉樹才能存儲(chǔ)。因?yàn)殚畔荆槐4嬗行У狞c(diǎn)蓬衡,而不轉(zhuǎn)化的話,是無法知道以前的樹是怎么構(gòu)造出來的彤枢。

這樣存儲(chǔ)狰晚,耗用內(nèi)存空間過大。

鏈?zhǔn)酱鎯?chǔ):相對(duì)比較簡(jiǎn)單缴啡,耗用內(nèi)存空間也比較小壁晒。

2、一般樹的存儲(chǔ)

(1)雙親表示法:求父節(jié)點(diǎn)方便业栅。

(2)孩子表示法:求子節(jié)點(diǎn)方便秒咐。

(3)雙親孩子表示法:求父節(jié)點(diǎn)和子節(jié)點(diǎn)都方便。

(4)二叉樹表示法(孩子兄弟鏈表表示法):一般樹轉(zhuǎn)化成二叉樹來存儲(chǔ)碘裕。

具體轉(zhuǎn)換方法:設(shè)法保證任意一個(gè)節(jié)點(diǎn)的左指針域指向它的第一個(gè)孩子携取,右指針域指向它的下一個(gè)兄弟。
只要能滿足此條件帮孔,就可以把一個(gè)普通樹轉(zhuǎn)化為二叉樹雷滋。

一般樹轉(zhuǎn)化為二叉樹

一般樹轉(zhuǎn)化成的二叉樹,一定沒有右子樹。

3晤斩、森林的存儲(chǔ)

森林轉(zhuǎn)化成二叉樹來存儲(chǔ)焕檬。

森林轉(zhuǎn)化成二叉樹

五、二叉樹的遍歷

已知二叉樹澳泵,求其先序实愚、中序、后序序列

1烹俗、先序遍歷

先訪問根節(jié)點(diǎn)爆侣,再先序遍歷左子樹,再先序遍歷右子樹幢妄。

ABDCEFG

2兔仰、中序遍歷

中序遍歷左子樹,再訪問根節(jié)點(diǎn)蕉鸳,再中序遍歷右子樹乎赴。

DBAECGF

3、后序遍歷

中序遍歷左子樹潮尝,再中序遍歷右子樹榕吼,再訪問根節(jié)點(diǎn)。

DBEGFCA

4勉失、已知兩種遍歷序列求原始二叉樹

通過先序和中序羹蚣,或者中序和后序,我們可以還原出原始的二叉樹乱凿。但是顽素,通過先序和后序是無法還原出原始的二叉樹的。

只有通過先序和中序徒蟆,或者中序和后序胁出,才可以唯一地確定一個(gè)二叉樹。

5段审、已知先序和中序全蝶,求后序

先序:ABCDEFGH
中序:BDCEAFHG
求后序?

后序序列為:DECBHGFA

6寺枉、已知中序和后序抑淫,求先序

中序:BDCEAFHG
后序:DECBHGFA
求先序?

先序:ABCDEFGH

7型凳、鏈?zhǔn)蕉鏄浔闅v-程序

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

struct BTNode
{
    char data;
    struct BTNode * pLchild;
    struct BTNode * pRchild;
};

struct BTNode * CreateBTree(void);
void PreTraverseBTree(struct BTNode * pT);
void InTraverseBTree(struct BTNode * pT);
void PostTraverseBTree(struct BTNode * pT);

int main(void)
{
    struct BTNode * pT = CreateBTree(); // pT保存根節(jié)點(diǎn)的地址 

    printf("先序:\n");
    PreTraverseBTree(pT); // 先序遍歷 
    printf("中序:\n");
    InTraverseBTree(pT); // 中序遍歷
    printf("后序:\n");
    PostTraverseBTree(pT); // 后序遍歷 

    return 0;
}

void PreTraverseBTree(struct BTNode * pT)
{
    if(NULL != pT)
    {
        printf("%c\n", pT->data); // 先訪問根節(jié)點(diǎn)
        if(NULL != pT->pLchild)
        {
            PreTraverseBTree(pT->pLchild); // 先序遍歷左子樹丈冬。pT->pLchild 代表整個(gè)左子樹 
        }
        if(NULL != pT->pRchild)
        {
            PreTraverseBTree(pT->pRchild); // 先序遍歷右子樹。pT->pRchild 代表整個(gè)右子樹
        } 
    }
}

void InTraverseBTree(struct BTNode *pT)
{
    if(NULL != pT)
    {
        if(NULL != pT->pLchild)
        {
            InTraverseBTree(pT->pLchild); // 中序遍歷左子樹甘畅。pT->pLchild 代表整個(gè)左子樹 
        }
    
        printf("%c\n", pT->data); // 訪問根節(jié)點(diǎn)
    
        if(NULL != pT->pRchild)
        {
            InTraverseBTree(pT->pRchild); // 中序遍歷右子樹。pT->pRchild 代表整個(gè)右子樹
        } 
    }
}

void PostTraverseBTree(struct BTNode *pT)
{
    if(NULL != pT)
    {
        if(NULL != pT->pLchild)
        {
            PostTraverseBTree(pT->pLchild); // 后序遍歷左子樹。pT->pLchild 代表整個(gè)左子樹 
        }
    
        if(NULL != pT->pRchild)
        {
            PostTraverseBTree(pT->pRchild); // 后序遍歷右子樹疏唾。pT->pRchild 代表整個(gè)右子樹
        } 
    
        printf("%c\n", pT->data); // 訪問根節(jié)點(diǎn)
    }
}

// 靜態(tài)創(chuàng)建一個(gè)鏈?zhǔn)蕉鏄?
// 返回根節(jié)點(diǎn)的地址 
struct BTNode * CreateBTree(void)
{
    struct BTNode * pA = (struct BTNode *)malloc(sizeof(struct BTNode));
    struct BTNode * pB = (struct BTNode *)malloc(sizeof(struct BTNode));
    struct BTNode * pC = (struct BTNode *)malloc(sizeof(struct BTNode));
    struct BTNode * pD = (struct BTNode *)malloc(sizeof(struct BTNode));
    struct BTNode * pE = (struct BTNode *)malloc(sizeof(struct BTNode));

    pA->data = 'A';
    pB->data = 'B';
    pC->data = 'C';
    pD->data = 'D';
    pE->data = 'E';

    pA->pLchild = pB;
    pA->pRchild = pC;
    pB->pLchild = pB->pRchild = NULL;
    pC->pLchild = pD;
    pC->pRchild = NULL;
    pD->pLchild = NULL;
    pD->pRchild = pE;
    pE->pLchild = pE->pRchild = NULL;

    return pA;
};

六蓄氧、樹的應(yīng)用

樹是數(shù)據(jù)庫中數(shù)據(jù)組織的一種重要形式。
操作系統(tǒng)父子進(jìn)程的關(guān)系本身就是一棵樹槐脏。
面向?qū)ο笳Z言中類的繼承關(guān)系本身就是一棵樹喉童。
赫夫曼樹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顿天,一起剝皮案震驚了整個(gè)濱河市堂氯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牌废,老刑警劉巖咽白,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鸟缕,居然都是意外死亡晶框,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門懂从,熙熙樓的掌柜王于貴愁眉苦臉地迎上來授段,“玉大人,你說我怎么就攤上這事番甩∏止螅” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵缘薛,是天一觀的道長(zhǎng)窍育。 經(jīng)常有香客問我,道長(zhǎng)掩宜,這世上最難降的妖魔是什么蔫骂? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮牺汤,結(jié)果婚禮上辽旋,老公的妹妹穿的比我還像新娘。我一直安慰自己檐迟,他們只是感情好补胚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著追迟,像睡著了一般溶其。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敦间,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天瓶逃,我揣著相機(jī)與錄音束铭,去河邊找鬼。 笑死厢绝,一個(gè)胖子當(dāng)著我的面吹牛契沫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昔汉,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼懈万,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了靶病?” 一聲冷哼從身側(cè)響起会通,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎娄周,沒想到半個(gè)月后涕侈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡昆咽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年驾凶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掷酗。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡调违,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出泻轰,到底是詐尸還是另有隱情技肩,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布浮声,位于F島的核電站虚婿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏泳挥。R本人自食惡果不足惜然痊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屉符。 院中可真熱鬧剧浸,春花似錦、人聲如沸矗钟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吨艇。三九已至躬它,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間东涡,已是汗流浹背冯吓。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工倘待, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桑谍。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓延柠,卻偏偏與公主長(zhǎng)得像祸挪,于是被迫代替她去往敵國(guó)和親锣披。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu)贿条,樹與前面介紹的線性表雹仿,棧,隊(duì)列等線性結(jié)構(gòu)不同整以,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,442評(píng)論 1 31
  • 判定樹 每個(gè)結(jié)點(diǎn)需要查找的次數(shù)剛好為該結(jié)點(diǎn)所在的層數(shù)胧辽,查找成功時(shí)查找次數(shù)不會(huì)超過判定樹的深度,n個(gè)結(jié)點(diǎn)的判定樹的深...
    sunxiaohang閱讀 1,480評(píng)論 0 3
  • 基于樹實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)公黑,具有兩個(gè)核心特征: 邏輯結(jié)構(gòu):數(shù)據(jù)元素之間具有層次關(guān)系邑商; 數(shù)據(jù)運(yùn)算:操作方法具有Log級(jí)的平...
    yhthu閱讀 4,254評(píng)論 1 5
  • 1 序 2016年6月25日夜,帝都凡蚜,天下著大雨人断,拖著行李箱和同學(xué)在校門口照了最后一張合照,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,078評(píng)論 0 12
  • Given an array nums, write a function to move all 0's to ...
    a_void閱讀 61評(píng)論 0 0