樹(定義、存儲結(jié)構(gòu)掘托、遍歷二叉樹)

樹是n(n>=0)個結(jié)點的有限集瘦锹,n=0時稱為空樹,在任意一顆非空樹中:

  • 有且只有一個特定的稱為(Root)的結(jié)點
  • 當n > 1時,其余結(jié)點可分為m(m>0)個互不相交有限集T1,T2...Tm沼本,其中每一個集合本身又是一棵樹噩峦,并且稱為根的子樹(SubTree)
  1. 結(jié)點擁有的子樹稱為結(jié)點的(Degree),度為0的結(jié)點稱為葉結(jié)點(Leaf)或終端結(jié)點抽兆,度不為0的結(jié)點稱為分支結(jié)點非終端結(jié)點,除根節(jié)點之外族淮,分支結(jié)點也稱為內(nèi)部結(jié)點辫红,樹的度是樹內(nèi)各結(jié)點的度的最大值
  2. 結(jié)點的子樹的根稱為該結(jié)點的孩子(Child),該結(jié)點稱為孩子的雙親(Parent)祝辣,同一個雙親的孩子之間互稱兄弟(Sibling)贴妻,結(jié)點的祖先是從根到該結(jié)點所經(jīng)分支上的所有結(jié)點,以某結(jié)點為根的子樹中的任一結(jié)點都稱為該結(jié)點的子孫
  3. 結(jié)點的層次:根為第一層蝙斜,根的孩子為第二層名惩,雙親在同一層的結(jié)點互為堂兄弟,樹中結(jié)點的最大層次稱為樹的深度(Depth)或高度
  4. 如果將樹中結(jié)點的各子樹看成從左至右是有順序的孕荠,不能互換的 娩鹉,則該樹稱為有序樹,否則稱為無序樹
  5. 森林是m(m>=0)棵互不相交的樹的集合

樹的存儲結(jié)構(gòu)

簡單的順序存儲結(jié)構(gòu)是不能滿足樹的實現(xiàn)要求的稚伍,但結(jié)合鏈式存儲結(jié)構(gòu)可以滿足

雙親表示法

除了根結(jié)點弯予,每個結(jié)點一定且僅有一個雙親

  1. 雙親表示法結(jié)點定義:在每個結(jié)點中附設(shè)一個指示器指示其雙親結(jié)點在數(shù)組中的位置,即一個數(shù)據(jù)域个曙、一個指針域(存放雙親下標)
  2. 可以靈活擴展此結(jié)構(gòu)锈嫩,把指針域擴展為長子域、右兄弟域等
  3. 一個存儲結(jié)構(gòu)設(shè)計的是否合理垦搬,取決于基于該存儲結(jié)構(gòu)的運算是否合適呼寸、方便、時間復(fù)雜度好壞等

孩子表示法

每個結(jié)點有多個指針域猴贰,其中每個指針指向一棵子樹的根結(jié)點对雪,這稱為多重鏈表表示法,有兩種方案:

  • 指針域的個數(shù)就等于樹的度糟趾;對于樹中各結(jié)點的度相差很大時會浪費空間
  • 是專門取一個位置(度域)來存儲結(jié)點指針域的個數(shù)慌植;各結(jié)點的鏈表結(jié)構(gòu)不同,損耗運算時間

結(jié)合該兩種方案做到既可以減少空指針的浪費又能使結(jié)點結(jié)構(gòu)相同义郑,即孩子表示法蝶柿,具體為:

  • 把每個結(jié)點的孩子結(jié)點排列起來,以單鏈表做存儲結(jié)構(gòu)非驮,則n個結(jié)點有n個孩子鏈表交汤,葉子節(jié)點為空表
  • n個頭指針又組成一個線性表,采用順序存儲結(jié)構(gòu),存放進一個一維數(shù)組中

如此一來芙扎,要查找某個結(jié)點的某個孩子或兄弟星岗,只需要查找這個結(jié)點的孩子單鏈表即可

如果還想知道某個結(jié)點的雙親是誰,可以結(jié)合雙親表示法戒洼,形成雙親孩子表示法

孩子兄弟表示法

  1. 任何一棵樹俏橘,它的結(jié)點的第一個孩子如果存在,就是唯一的圈浇,它的右兄弟如果存在也是唯一的寥掐。因此設(shè)置兩個指針,分別指向該結(jié)點的第一個孩子和此結(jié)點的右兄弟
  2. 孩子兄弟表示法結(jié)構(gòu)定義:數(shù)據(jù)域磷蜀、兩個指針域(指向該結(jié)點的第一個孩子結(jié)點召耘、指向右兄弟結(jié)點)

二叉樹

由n個結(jié)點組成的有限集合,該集合或為空集(空二叉樹)褐隆,或由一個根結(jié)點和兩棵互不相交污它、分別稱為根結(jié)點的左子樹右子樹的二叉樹組成

特點:

  • 每個結(jié)點最多有兩棵子樹(0~2棵)
  • 左子樹和右子樹的次序不能變
  • 只有一棵子樹時也要區(qū)分左右子樹

二叉樹的五種基本形態(tài):空二叉樹、只有根結(jié)點庶弃、只有左子樹衫贬、只有右子樹、有左右子樹

特殊二叉樹:

  • 斜樹:每一層都只有一個結(jié)點虫埂,結(jié)點的個數(shù)與二叉樹的深度相同祥山;分左斜樹右斜樹
  • 滿二叉樹:所有葉子都在最底層;分支結(jié)點的度一定是2掉伏;與同深度的二叉樹比缝呕,滿二叉樹的結(jié)點和葉子數(shù)最多
  • 完全二叉樹:按層序編號,如果編號沒出現(xiàn)空檔(存在的結(jié)點位置和同條件的滿二叉樹的位置相同)則是斧散;葉結(jié)點只能在最后兩層供常,與同深度的二叉樹比,完全二叉樹的深度最小

二叉樹的性質(zhì)

  1. 性質(zhì)1:在二叉樹的第i層上至多有2^(i-1)個結(jié)點(i>=1)
  2. 性質(zhì)2:深度為k的二叉樹至多有(2^k)-1個結(jié)點 (k>=1)
  3. 性質(zhì)3:葉結(jié)點數(shù)=度為2的結(jié)點數(shù)+1(通過推導(dǎo)總結(jié)點數(shù)和分支線總數(shù)得出)
  4. 性質(zhì)4:具有n個結(jié)點的完全二叉樹的深度為[log2n]+1(性質(zhì)2的倒推)
  5. 性質(zhì)5:對一棵有n個結(jié)點的完全二叉樹的結(jié)點按層編號鸡捐,對任一結(jié)點i有
    • 若i=1栈暇,則i是根結(jié)點,無雙親箍镜;若i>1源祈,則雙親是結(jié)點i/2
    • 若2i>n,則結(jié)點i無左孩子(結(jié)點i為葉子結(jié)點)色迂;否則其左孩子是結(jié)點2i
    • 若2i+1>n香缺,則結(jié)點i無右孩子;否則其右孩子是結(jié)點2i+1

二叉樹的存儲結(jié)構(gòu)

順序存儲結(jié)構(gòu):用一維數(shù)組存儲二叉樹中結(jié)點歇僧,對一般的二叉樹不能反應(yīng)邏輯關(guān)系图张;一般用于完全二叉樹
二叉鏈表:由結(jié)點數(shù)據(jù)(數(shù)據(jù)域)、左右孩子指針(兩個指針域)定義的鏈表;若再加一個指向雙親的指針域就稱為三叉鏈表

遍歷二叉樹

指從根結(jié)點出發(fā)祸轮,按照某種次序依次訪問二叉樹中所有結(jié)點兽埃,使得每個結(jié)點被訪問一次且僅被訪問一次

前序遍歷算法:

先前序遍歷左子樹,再前序遍歷右子樹

/* 用C實現(xiàn)二叉樹的前序遍歷遞歸算法*/

void PreOrder(BiTree T)
{
    if (T == NULL)
        return;
    printf("%c", T->data);   /*對結(jié)點的操作*/
    PreOrder(T->lchild)
    PreOrder(T->rchild)
}

中序遍歷算法:

先中序遍歷根結(jié)點的左子樹适袜,然后訪問根結(jié)點柄错,最后中序遍歷右子樹
與前序遍歷相比相當于把調(diào)用左孩子的遞歸函數(shù)提前了
遍歷到左孩子為NULL的結(jié)點時才返回對結(jié)點操作,然后再對該結(jié)點的右子樹做同樣遍歷

/* 用C實現(xiàn)二叉樹的中遍歷遞歸算法*/

void InOrder(BiTree T)
{
    if (T == NULL)
        return;
    InOrder(T->lchild)    /*提前*/
    printf("%c", T->data);   /*對結(jié)點的操作*/
    InOrder(T->rchild)
}

后序遍歷算法:

從左到右的順序先遍歷葉子再遍歷結(jié)點的方式遍歷訪問左右子樹

/* 用C實現(xiàn)二叉樹的后遍歷遞歸算法*/

void PostOrder(BiTree T)
{
    if (T == NULL)
        return;
    PostOrder(T->lchild)   /*先左*/
    PostOrder(T->rchild)  /*再右*/
    printf("%c", T->data);   /*對結(jié)點的操作*/
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痪蝇,一起剝皮案震驚了整個濱河市鄙陡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌躏啰,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耙册,死亡現(xiàn)場離奇詭異给僵,居然都是意外死亡,警方通過查閱死者的電腦和手機详拙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門帝际,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饶辙,你說我怎么就攤上這事蹲诀。” “怎么了弃揽?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵脯爪,是天一觀的道長。 經(jīng)常有香客問我矿微,道長痕慢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任涌矢,我火速辦了婚禮掖举,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娜庇。我一直安慰自己塔次,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布名秀。 她就那樣靜靜地躺著励负,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泰偿。 梳的紋絲不亂的頭發(fā)上熄守,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音,去河邊找鬼裕照。 笑死攒发,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的晋南。 我是一名探鬼主播惠猿,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼负间!你這毒婦竟也來了偶妖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤政溃,失蹤者是張志新(化名)和其女友劉穎趾访,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體董虱,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡扼鞋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了愤诱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片云头。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖淫半,靈堂內(nèi)的尸體忽然破棺而出溃槐,到底是詐尸還是另有隱情,我是刑警寧澤科吭,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布昏滴,位于F島的核電站,受9級特大地震影響砌溺,放射性物質(zhì)發(fā)生泄漏影涉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一规伐、第九天 我趴在偏房一處隱蔽的房頂上張望蟹倾。 院中可真熱鬧,春花似錦猖闪、人聲如沸鲜棠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豁陆。三九已至,卻和暖如春吵护,著一層夾襖步出監(jiān)牢的瞬間盒音,已是汗流浹背表鳍。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留祥诽,地道東北人譬圣。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像雄坪,于是被迫代替她去往敵國和親厘熟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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