我是一棵「樹」

我是一顆樹,以前咱們數據結構家族中的一個小朋友——「棧」 已經給大家介紹過的咱們這個家族了(我是一個「棧」)。之因此叫棧爲小朋友,是由於我和他的爸爸——數組是平輩的。數組

之因此存在咱們這樣一個家庭,最主要的緣由是數組他們家庭雖然很強大,可是有必定的侷限性。你們都知道,不管是數組、鏈表以及他們家的那幾個小娃娃(棧、隊列)等,存儲的數據之間都只有簡單的先後順序關係。數據結構

既然說到這了,那就在給大家科普一下整個數據結構你們族吧。畢竟大家認識的那個「棧」只是個小晚輩,對咱們家族的歷史什麼的都不是很瞭解。3d

數據結構,主要有兩個做用,第一個是存儲數據,第二個是能夠反應所存儲的數據之間的邏輯關係,注意,邏輯關係並非他們在計算機中存儲的物理位置關係哦。因此,根據你們存儲的數據的邏輯結構的不一樣,主要能夠分爲這個幾個大的分支:cdn

  • 集合
    • 他們家幫別人存儲的數據之間什麼關係都沒有,惟一的關係可能就是同處於同一個集合了。

jihe

  • 線性結構
    • 他們家呢,幫別人存儲的數據之間是有順序的,數據之間在邏輯上是首尾相接的連續保存的。因此,元素之間存在着一對一的關係。好比大家認識的數組家族,就是線性結構的。

xianxing

  • 樹形結構
    • 嘿,這就是咱們的家族啦,咱們存儲元素存在着一對多的相互關係。

shuxing

  • 圖形結構
    • 圖形結構分支是一種複雜的數據結構。數據元素間的關係是任意的。任意兩個數據元素間都可相關聯。

tuxing

你們瞭解的數組、隊列、棧、鏈表他們都屬於線性結構的分支的。今天的主角,也就是我和個人「樹」家族是樹形結構這個大的分支中的。blog

也許你已經猜到了,我是整個數據結構你們族的樹形結構這一分支的族長。做爲一個龐大的家族分支,咱們固然具有整個數據結構家族的基本功能——數據存儲。另外,整個樹形分支主要用來保存具備樹形結構的數據集合。說的白一點,就是咱們幫別人存儲的數據是有層次關係的。就像天然界中的一顆倒置的樹同樣。繼承

先來講下找咱們保存數據的一些限制和要求吧。咱們幫別人保存的每一個元素咱們稱之爲節點,而咱們通常有一個特定的結點被稱爲根節點,其他的結點都叫非根節點。下面給你看一顆標準的樹,而後經過這張圖,再來介紹下什麼是葉節點、父節點等概念。隊列

樹

H節點是O和L的父節點,O和L是H節點的子節點。 H節點是根節點,由於他沒有父節點。 I、S和L節點是葉結點,由於他們沒有子節點。 I和S是兄弟節點,由於他們的父節點都是O節點。get

好了,說好了這些了,該帶你見一見個人家族成員了。做爲數據結構的樹家族的你們族,我有不少後代。先來給你看下個人家譜:it

tree

我有兩個兒子:小兒子有序樹、大兒子無序樹。大兒子是家族的頂樑柱,承擔起了家族的不少工做。而個人小兒子,就是一個比較自由的孩子,無憂無慮的什麼也無論,因此你們有時候也叫他自由樹。io

先來講說這個我十分寵愛的小兒子——無序樹。

無序樹

無序樹,他也是個樹形結構,除了樹中的父子節點之間有關係之外,同一個父節點的全部子節點之間是不要緊的,在樹中,這種關係就是順序,好比誰在前誰在後。因此,他叫無序樹。另外,個人這個小兒子因爲太過自由,至今都沒給我生出個娃娃來。因此,個人小兒子是個孤家寡人。

再來詳細說說他的數據存儲方面的事情,前面說了,他存儲的數據之間只有父子節點間有關係。若是你讓他幫你存儲A、B、C三個數據的話,1個父節點,2個子結點的狀況有 3 種。

無序

不管兩個子節點位置關係如何,都是同一棵樹。即A-B-C和A-C-B被認爲是同一棵樹。

有序樹

再來介紹一下個人大兒子,整個樹家的順位繼承人。他真的作到了一個長子應該作的全部事情,他和他的孩子們幾乎包攬了樹家族的全部工做內容。

他和無序樹的區別比較明顯,就是在有序數中,子節點之間是有順序關係的。若是你讓個人大兒子幫你存儲A、B、C三個數據的話,1個父節點,2個子結點的狀況有 6 種。

有序

只要兩個節點的順序掉換一下,又是一個新的樹。A-B-C和A-C-B被認爲是兩棵不一樣的樹。

從上面的家族圖譜中能夠發現,個人大兒子有序樹也有不少孩子的。其中我比較出名的三個孫子分別是二叉樹、霍夫曼樹和B樹等。

如今的年輕人,都頗有個性的,幫別人存儲數據的時候都有不少要求呢,不過也好,年輕人嘛,就應該有點性格。也得益於他們的各自的特性,樹家族才能如此強大。

關於有序樹的幾個晚輩的介紹,後面讓他們本身來吧,我這把老骨頭說了這麼多也累了。

相關文章
相關標籤/搜索