樹形結構是一類很重要的非線性資料結構,它可以很好的描述客觀世界中具有分支結構或者階層的對象,如作業系統的檔案管理,編譯器中的文法結構和資料庫系統資訊組織形式等。
樹的定義如下:
樹是n(n>=0)個節點的有限集T,當T為空白時為空白樹,否則滿足一下兩個條件:
(1)有且僅有一個特定的稱為根的節點;
(2)其餘的節點可以分為m個互不相交的子集,其中每個子集又是一棵樹,稱為根節點的子樹。
樹的表示方法大概有以下幾種:樹形結構圖,嵌套結構表示圖,凹入式標記法。
二叉樹是樹形結構的一種重要形式,許多實際問題抽象出來資料結構往往都是二叉樹的形式,即使是一般的樹也可以轉換為二叉樹的形式。
二叉樹是n(n>=0)個節點的有限集,它或者是空集或者是由一個根節點和兩顆互不相交的稱為根節點的左子樹和右子樹組成。
需要說明的是:
(1)二叉樹與無序樹不同,二叉樹每個節點至多有兩顆子樹,並且有左右之分,
(2)二叉樹和度數為2的有序樹不同,在有序樹中,雖然一個節點的孩子有左右之分,但是如果只有一個孩子,那麼就無需區分左右,對於二叉樹,即使只有一個孩子,則也有左右之分。
二叉樹的儲存一般有兩種,順序儲存結構和鏈式儲存結構。
順序儲存結構就是將二叉樹中的節點按照一定的次序儲存到一片連續的儲存空間中。節點在這個序列的位置能夠反映節點之間的相互位置關係。
對於完全二叉樹來說,我們從根起,從左至右,給樹中所有的節點進行編號,就能夠得到一個反映二叉樹結構的線性序列。
完全二叉樹中除最下面一層外,各層都充滿了結點。每一層的結點個數恰好是上一層結點個數的2倍。從一個結點的編號就可推得其雙親,左、右孩子,兄弟等結點的編號。假設編號為i的結點是ki(1≤i≤n),則有:
①若i>1,則ki的雙親編號為 ;若i=1,則Ki是根結點,無雙親。
②若2i≤n,則Ki的左孩子的編號是2i;否則,Ki無左孩子,即Ki必定是葉子。因此完全二叉樹中編號
的結點必定是葉結點。
③若2i+1≤n,則Ki的右孩子的編號是2i+1;否則,Ki無右孩子。
④若i為奇數且不為1,則Ki的左兄弟的編號是i-1;否則,Ki無左兄弟。
⑤若i為偶數且小於n,則Ki的右兄弟的編號是i+1;否則,Ki無右兄弟。
將完全二叉樹中所有結點按編號順序依次儲存在一個向量bt[0..n]中。其中: bt[1..n]用來儲存結點, bt[0]不用或用來儲存結點數目。
上面的是對於完全二叉樹,但是我們知道,一般情況下我們的二叉樹並不總是完全二叉樹,對於一般的二叉樹,我們需要向樹中添加一些“虛節點”,使其變成完全二叉樹。
對於鏈式儲存結構,顧名思義,就是在每個節點中儲存對於其子節點的引用。如果一個節點的左子節點為空白,則將指向左子樹的引用置空,如果右子節點為空白,則將指向右子節點的引用置空。一個二叉樹鏈表由一個指向根節點的引用決定。如果該引用為空白,則二叉樹為空白。
對於完全二叉樹來說,順序儲存結構既簡單又節約儲存空間,但是對於一般的二叉樹來說,順序儲存結構容易造成儲存空間的浪費,同時對一個二叉樹進行增加和刪除操作順序儲存結構也會造成大量的移動。所以一般來說我們比較喜歡使用鏈式儲存結構來儲存二叉樹。