我是一棵“树”
轉(zhuǎn)載自?我是一棵“樹”
?
我是一顆樹,之前我們數(shù)據(jù)結(jié)構(gòu)家族中的一個(gè)小朋友——“棧” 已經(jīng)給你們介紹過的我們這個(gè)家族了(我是一個(gè)“棧”)。之所以叫棧為小朋友,是因?yàn)槲液退陌职帧獢?shù)組是平輩的。
之所以存在我們這樣一個(gè)家庭,最主要的原因是數(shù)組他們家庭雖然很強(qiáng)大,但是有一定的局限性。大家都知道,無(wú)論是數(shù)組、鏈表以及他們家的那幾個(gè)小娃娃(棧、隊(duì)列)等,存儲(chǔ)的數(shù)據(jù)之間都只有簡(jiǎn)單的前后順序關(guān)系。
既然說(shuō)到這了,那就在給你們科普一下整個(gè)數(shù)據(jù)結(jié)構(gòu)大家族吧。畢竟你們認(rèn)識(shí)的那個(gè)“棧”只是個(gè)小晚輩,對(duì)我們家族的歷史什么的都不是很了解。
數(shù)據(jù)結(jié)構(gòu)家族
數(shù)據(jù)結(jié)構(gòu),主要有兩個(gè)作用,第一個(gè)是存儲(chǔ)數(shù)據(jù),第二個(gè)是可以反應(yīng)所存儲(chǔ)的數(shù)據(jù)之間的邏輯關(guān)系,注意,邏輯關(guān)系并不是他們?cè)谟?jì)算機(jī)中存儲(chǔ)的物理位置關(guān)系哦。所以,根據(jù)大家存儲(chǔ)的數(shù)據(jù)的邏輯結(jié)構(gòu)的不同,主要可以分為這個(gè)幾個(gè)大的分支:
-
集合?
他們家?guī)蛣e人存儲(chǔ)的數(shù)據(jù)之間什么關(guān)系都沒有,唯一的關(guān)系可能就是同處于同一個(gè)集合了。
-
線性結(jié)構(gòu)
他們家呢,幫別人存儲(chǔ)的數(shù)據(jù)之間是有順序的,數(shù)據(jù)之間在邏輯上是首尾相接的連續(xù)保存的。所以,元素之間存在著一對(duì)一的關(guān)系。比如你們認(rèn)識(shí)的數(shù)組家族,就是線性結(jié)構(gòu)的。
-
樹形結(jié)構(gòu)?
嘿,這就是我們的家族分支啦,我們存儲(chǔ)元素存在著一對(duì)多的相互關(guān)系。
-
圖形結(jié)構(gòu)?
圖形結(jié)構(gòu)分支是一種復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)元素間的關(guān)系是任意的。任意兩個(gè)數(shù)據(jù)元素間均可相關(guān)聯(lián)。
大家了解的數(shù)組、隊(duì)列、棧、鏈表他們都屬于線性結(jié)構(gòu)的分支的。今天的主角,也就是我和我的“樹”家族是樹形結(jié)構(gòu)這個(gè)大的分支中的。
也許你已經(jīng)猜到了,我是整個(gè)數(shù)據(jù)結(jié)構(gòu)大家族的樹形結(jié)構(gòu)這一分支的族長(zhǎng)。作為一個(gè)龐大的家族分支,我們當(dāng)然具備整個(gè)數(shù)據(jù)結(jié)構(gòu)家族的基本功能——數(shù)據(jù)存儲(chǔ)。另外,整個(gè)樹形分支主要用來(lái)保存具有樹形結(jié)構(gòu)的數(shù)據(jù)集合。說(shuō)的白一點(diǎn),就是我們幫別人存儲(chǔ)的數(shù)據(jù)是有層次關(guān)系的。就像自然界中的一顆倒置的樹一樣。
先來(lái)說(shuō)下找我們保存數(shù)據(jù)的一些限制和要求吧。我們幫別人保存的每個(gè)元素我們稱之為節(jié)點(diǎn),而我們一般有一個(gè)特定的結(jié)點(diǎn)被稱為根節(jié)點(diǎn),其余的結(jié)點(diǎn)都叫非根節(jié)點(diǎn)。下面給你看一顆標(biāo)準(zhǔn)的樹,然后通過這張圖,再來(lái)介紹下什么是葉節(jié)點(diǎn)、父節(jié)點(diǎn)等概念。
H節(jié)點(diǎn)是O和L的父節(jié)點(diǎn),O和L是H節(jié)點(diǎn)的子節(jié)點(diǎn)。
H節(jié)點(diǎn)是根節(jié)點(diǎn),因?yàn)樗麤]有父節(jié)點(diǎn)。?
I、S和L節(jié)點(diǎn)是葉結(jié)點(diǎn),因?yàn)樗麄儧]有子節(jié)點(diǎn)。?
I和S是兄弟節(jié)點(diǎn),因?yàn)樗麄兊母腹?jié)點(diǎn)都是O節(jié)點(diǎn)。
好了,說(shuō)好了這些了,該帶你見一見我的家族成員了。作為數(shù)據(jù)結(jié)構(gòu)的樹家族的大家族,我有很多后代。先來(lái)給你看下我的家譜:
我有兩個(gè)兒子:大兒子有序樹、小兒子無(wú)序樹。大兒子是家族的頂梁柱,承擔(dān)起了家族的很多工作。而我的小兒子,就是一個(gè)比較自由的孩子,無(wú)憂無(wú)慮的什么也不管,所以大家有時(shí)候也叫他自由樹。
先來(lái)說(shuō)說(shuō)這個(gè)我十分寵愛的小兒子——無(wú)序樹。
?
無(wú)序樹
無(wú)序樹,他也是個(gè)樹形結(jié)構(gòu),除了樹中的父子節(jié)點(diǎn)之間有關(guān)系以外,同一個(gè)父節(jié)點(diǎn)的所有子節(jié)點(diǎn)之間是沒關(guān)系的,在樹中,這種關(guān)系就是順序,比如誰(shuí)在前誰(shuí)在后。所以,他叫無(wú)序樹。另外,我的這個(gè)小兒子由于太過自由,至今都沒給我生出個(gè)娃娃來(lái)。所以,我的小兒子是個(gè)孤家寡人。
再來(lái)詳細(xì)說(shuō)說(shuō)他的數(shù)據(jù)存儲(chǔ)方面的事情,前面說(shuō)了,他存儲(chǔ)的數(shù)據(jù)之間只有父子節(jié)點(diǎn)間有關(guān)系。如果你讓他幫你存儲(chǔ)A、B、C三個(gè)數(shù)據(jù)的話,1個(gè)父節(jié)點(diǎn),2個(gè)子結(jié)點(diǎn)的情況有 3 種。
無(wú)論兩個(gè)子節(jié)點(diǎn)位置關(guān)系如何,都是同一棵樹。即A-B-C和A-C-B被認(rèn)為是同一棵樹。
?
有序樹
再來(lái)介紹一下我的大兒子,整個(gè)樹家的順位繼承人。他真的做到了一個(gè)長(zhǎng)子應(yīng)該做的所有事情,他和他的孩子們幾乎包攬了樹家族的所有工作內(nèi)容。
他和無(wú)序樹的區(qū)別比較明顯,就是在有序數(shù)中,子節(jié)點(diǎn)之間是有順序關(guān)系的。如果你讓我的大兒子幫你存儲(chǔ)A、B、C三個(gè)數(shù)據(jù)的話,1個(gè)父節(jié)點(diǎn),2個(gè)子結(jié)點(diǎn)的情況有 6 種。
只要兩個(gè)節(jié)點(diǎn)的順序掉換一下,又是一個(gè)新的樹。A-B-C和A-C-B被認(rèn)為是兩棵不同的樹。
從上面的家族圖譜中可以發(fā)現(xiàn),我的大兒子有序樹也有很多孩子的。其中我比較出名的三個(gè)孫子分別是二叉樹、霍夫曼樹和B樹等。
現(xiàn)在的年輕人,都很有個(gè)性的,幫別人存儲(chǔ)數(shù)據(jù)的時(shí)候都有很多要求呢,不過也好,年輕人嘛,就應(yīng)該有點(diǎn)性格。也得益于他們的各自的特性,樹家族才能如此強(qiáng)大。
關(guān)于有序樹的幾個(gè)晚輩的介紹,后面讓他們自己來(lái)吧,我這把老骨頭說(shuō)了這么多也累了。
?
總結(jié)
- 上一篇: 安森美半导体推出低功耗 Hyperlux
- 下一篇: 逆战 电脑配置(电脑配置逆战)