資料結構與演算法(七)-樹
阿新 • • 發佈:2018-12-12
前言:回顧一下前面學習的內容,大概說了下資料結構中的線性結構,從物理儲存方面來說又分為順序儲存和鏈式儲存結構,各自有自己的優缺點,順序儲存結構讀快寫慢,鏈式儲存結構寫快讀慢。但是這些資料元素之間的關係都為一對一的關係,而我們生活中關係不止是一對一,有可能是一對多,多對多,本篇先介紹一下一對多的儲存結構,那麼它是怎樣儲存才能保持它們之間的關係呢?
一、樹定義
生活中有很多這樣的例子,一個強盛家族的族譜,必然是呈金字塔形狀的,從一到多。就和樹一樣,一顆樹通常由根部長出一個樹幹,然後從樹幹長出一些樹枝,然後從樹枝上又長出更小的樹枝,而葉子則長在最細的樹枝上。樹這種資料結構正式像一顆倒過來的樹木。 所以對樹的定義,即樹是一種管理有像樹幹、樹枝、樹葉一樣關係的資料的資料結構。 樹由節點(頂點)和邊(枝)構成,並且有一個節點作為起始點。這個起始點稱為樹的根節點。從根節點上可以連出幾條邊,每條邊都和一個節點相連。延伸出來的這些節點又可以繼續通過邊延伸出新的結點。這個過程中,舊的節點稱作父結點,而延伸出來的新節點稱作子結點。一個子節點都沒有的節點就叫做葉子結點。另外,由根節點出發,到達某一個節點所要經過的邊的個數叫做這個節點的深度,節點擁有的子樹數稱為該節點的度,樹的度為各節點度的最大值。 下圖中,標著7、9和0三個數字的節點裡,7就是父節點,9和0就是子節點。另一個圖裡,標記6的這個節點就是“根節點”,標記3、5、11、8、10、9、2、17、14的這些節點就是“葉子節點”,而圖中12這個的深度是2。- 有且僅有一個特定的稱為根(Root)的節點;
- 當n>1時,其餘節點可分為m(m>0)個互不相交的有限集T1、T2、、、Tm,其中每一個集合本身由是一棵樹,並且稱為根的子樹(SubTree)。
節點的度:一個節點含有的子樹的個數稱為該節點的度; 葉節點或終端節點:度為0的節點稱為葉節點; 非終端節點或分支節點:度不為0的節點; 雙親節點或父節點:若一個節點含有子節點,則這個節點稱為其子節點的父節點; 孩子節點或子節點:一個節點含有的子樹的根節點稱為該節點的子節點; 兄弟節點:具有相同父節點的節點互稱為兄弟節點; 樹的度:一棵樹中,最大的節點的度稱為樹的度; 節點的層次:從根開始定義起,根為第1層,根的子節點為第2層,以此類推; 樹的高度或深度:樹中節點的最大層次; 堂兄弟節點:雙親在同一層的節點互為堂兄弟; 節點的祖先:從根到該節點所經分支上的所有節點; 子孫:以某節點為根的子樹中任一節點都稱為該節點的子孫。 森林:由m(m>=0)棵互不相交的樹的集合稱為森林;
二、樹的儲存結構
上面已經對樹的定義和概念做了個基本的認識,那麼我們最關心的還是怎麼在程式中實現該結構。 在計算機中資料的儲存有兩種結構順序儲存和鏈式儲存,順序儲存結構顯然是不行的,而鏈式儲存結構也是有缺點的,我們來看一下: 第一種: 由於鏈式儲存結構中的節點需含有子結點的引用或指標,但在樹中子節點的不確定性導致無法無法固定具體節點中有幾個引用或指標; Node節點結構示意圖: 我們可以根據樹的度來確定Node節點的結構,比如樹的度為3,那麼Node結構中就由3個對自己引用。三、樹的分類
樹的種類分很多,根據是子節點之間否有序可分為有序樹和無序樹; 根據子節點數量分為二叉樹和多路查詢樹; 而其中二叉樹又分為斜二叉樹、滿二叉樹、完全二叉樹、線索二叉樹、二叉排序樹、平衡二叉樹、紅黑樹、哈夫曼樹等。多路查詢樹分為2-3樹、2-3-4樹、B樹、B樹變種樹B+樹等。 有句話是這樣說的,一木成樹,兩木成林,三木成森,所以有樹就有森林,即n棵互不相交的樹稱為森。本系列參考書籍:
《寫給大家看的演算法書》
《圖靈程式設計叢書 演算法 第4版》