數(shù)據(jù)結(jié)構(gòu)-樹:基礎(chǔ)(一)

本篇主要講樹最基本的知識(shí)潭辈。

預(yù)備知識(shí)

一棵樹由稱做根root的節(jié)點(diǎn)r以及0個(gè)或者多個(gè)非空的(子)樹T1线罕,T1,...般哼,Tk組成吴汪,這些子樹中每一個(gè)棵的根都被來自根r的一條有向的邊edge鏈接。

  • 兒子蒸眠、父親:
    每一棵子樹的根節(jié)點(diǎn)叫做根r的兒子child漾橙,而r是每一棵子樹根的父親parent。例如AE的父親楞卡,EA的兒子霜运。
  • 樹葉:
    每一個(gè)子樹也可以有自己的兒子,而沒有兒子的子樹叫做樹葉leaf臀晃。例如B觉渴、CP
  • 兄弟徽惋、祖父案淋、孫子
    具有相同父親的節(jié)點(diǎn)為兄弟,類似的還有孫子和祖父险绘。例如D踢京、E為兄弟,AJ的祖父宦棺、JA的孫子瓣距。
  • 深度、高
    從根到該節(jié)點(diǎn)唯一路徑的長(zhǎng)代咸。比如根的深度為0蹈丸。
    從該節(jié)點(diǎn)到一片樹葉的最長(zhǎng)路徑的長(zhǎng)。比如所有的樹葉高都是0,一棵樹的高等于它根的高逻杖。
    例如:E的深度為1奋岁,而高為2F的深度是1荸百,而高也是1闻伶。
    image.png

樹的實(shí)現(xiàn)

由于每個(gè)節(jié)點(diǎn)兒子數(shù)可以變化很大,并且事先不知道够话,因此在數(shù)據(jù)結(jié)構(gòu)中建立到各個(gè)兒子節(jié)點(diǎn)直接的鏈接是不可行的蓝翰,因?yàn)檫@樣會(huì)浪費(fèi)太多的空間。(這是書上的說法女嘲,我覺得估一個(gè)大概的數(shù)量畜份,直接把兒子數(shù)組的寬度寫死也是可以的)

這里的解法是:將每個(gè)節(jié)點(diǎn)的所有兒子都放在樹節(jié)點(diǎn)的鏈表中。
一種典型的聲明:

typedef struct TreeNode * PtrToNode;

struct TreeNode
{
    ElementType Element;
    PtrToNode   FirstClild;
    PtrToNode   NextSibling;
}

在下圖的表示方式中澡为,向下的紫色箭頭是指向FirstChild(第一個(gè)兒子)的指針漂坏。從左到右的箭頭是指向NextSibling(下一個(gè)兄弟)的指針。這里并沒有畫空指針媒至。

image.png

樹的遍歷及應(yīng)用

最流行的用法之一就是操作系統(tǒng)中的目錄結(jié)構(gòu)顶别。如下圖,有*號(hào)的表示一個(gè)目錄拒啰。

image.png

假設(shè)我們想要列出目錄中所有文件的名字驯绎。我們的輸出格式將是:深度
di 的文件的名字將被 di 次跳格(tab)縮進(jìn)后打印出來。

算法如下:

static void ListDir( DirectoryOrFile D, int Depth ) 
{
    if( D is a legitimate entry) //合法入口
    {
        PrintName(D, Depth);
        if( D is a directory )
            for each child, C, of D
                ListDir( C, Depth + 1 );
    }
}

void ListDirectory( DirectoryOfFile D )
{
    ListDir( D, 0 );
}

算法的核心為遞歸過程ListDir谋旦。為了顯示根時(shí)不進(jìn)行縮進(jìn)剩失,該例程需要從目錄名和深度0開始。

image.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末册着,一起剝皮案震驚了整個(gè)濱河市拴孤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甲捏,老刑警劉巖演熟,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異司顿,居然都是意外死亡芒粹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門大溜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來化漆,“玉大人,你說我怎么就攤上這事钦奋∽疲” “怎么了疙赠?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)疙教。 經(jīng)常有香客問我棺聊,道長(zhǎng)伞租,這世上最難降的妖魔是什么贞谓? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮葵诈,結(jié)果婚禮上裸弦,老公的妹妹穿的比我還像新娘。我一直安慰自己作喘,他們只是感情好理疙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泞坦,像睡著了一般窖贤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贰锁,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天赃梧,我揣著相機(jī)與錄音,去河邊找鬼豌熄。 笑死授嘀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锣险。 我是一名探鬼主播蹄皱,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼芯肤!你這毒婦竟也來了巷折?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤崖咨,失蹤者是張志新(化名)和其女友劉穎锻拘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掩幢,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逊拍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了际邻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芯丧。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖世曾,靈堂內(nèi)的尸體忽然破棺而出缨恒,到底是詐尸還是另有隱情谴咸,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布骗露,位于F島的核電站岭佳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏萧锉。R本人自食惡果不足惜珊随,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柿隙。 院中可真熱鬧叶洞,春花似錦、人聲如沸禀崖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)波附。三九已至艺晴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掸屡,已是汗流浹背封寞。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留折晦,地道東北人钥星。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像满着,于是被迫代替她去往敵國(guó)和親谦炒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353