數據結構之二叉樹
- 一種非線性數據結構
- 樹(森林)
- 四種表示方法
- 樹形表示法
- 嵌套集合表示法
- 凹入表表示法
- 廣義表表示法
- 四種表示方法
- 二叉樹
- 五種基本形態
- 空二叉樹
- 單結點的二叉樹
- 右子樹爲空的二叉樹
- 左子樹爲空的二叉樹
- 左右子樹均非空的二叉樹
- 兩種特殊的二叉樹
- 滿二叉樹:一顆二叉樹的深度爲k,則其有2^k-1個節點。
- 完全二叉樹:先把前面的節點填滿才能填後面的。滿二叉樹是完全二叉樹的特例。
- 遍歷二叉樹
- 五種基本形態
- 樹形結構的存儲方式:鏈式存儲和順序存儲
- 線索二叉樹
- 堆
- 堆的構造
- 堆的插入與刪除
- 哈夫曼樹:一類帶權路徑長度最短的樹。
幾種樹的名稱:多叉樹、二叉樹、二叉排序樹、完全二叉樹、完全二叉排序樹、平衡二叉樹、平衡二叉排序樹(AVL樹)
滿二叉樹是完全二叉樹中的一種特殊情況;堆是完全二叉樹中的一種特殊情況。完全二叉樹是平衡二叉樹中的一種。
二叉樹的性質:
- 在二叉樹第i層上至多有2^(i-1)個節點(i>=1)
- 深度爲k的二叉樹至多有2^k-1個節點
- 對任何一棵二叉樹T,設n_0、n_2分別是葉節點的個數和度爲2的節點的個數,則有n_0=n_2+1。
- 具有n個節點的完全二叉樹的深度爲「log2(n)」+1。(向下取整)
- 對於一棵有n個節點的完全二叉樹,其任何一個編號爲i的節點(1<=i<=n),都有以下結果:
- 關於父節點:
- 若i=1,則節點i是根節點,無父節點;
- 若i>i,則節點i的父節點是節點「i/2」。
- 對於左子節點:
- 若2i<n,則節點 i 的左子節點是2i;
- 若2i>n,則節點 i 無左子節點。
- 對於右子節點:
- 若2i+1<n,則節點 i 的右子節點是2i+1;
- 若2i+1>n,則節點 i 無右子節點。
- 關於父節點:
二叉樹的存儲方式:
- 順序存儲結構:適合完全二叉樹;完全二叉樹可用一維數組依次存儲它的各節點。
- 鏈式存儲結構:對於一般二叉樹(非完全二叉樹),比較適合使用一種二叉鏈表結構(非線性鏈表)來存儲;在這種鏈表中,每個節點至少包含3個域:數據域和左、右指針域。
二叉樹的遍歷:
- 前序:即先根遍歷(整棵樹的根節點在最前面),遍歷順序爲:根—左子樹—右子樹;按照這種順序遍歷,直至沒有子節點爲止。
- 中序:即中根遍歷,遍歷順序爲:左子樹—根—右子樹;
- 後序:即後根遍歷(整棵樹的根節點在最後面),遍歷順序爲:左子樹—右子樹—根
在編程實現時,前三種遍歷需要藉助遞歸實現。
- 按層遍歷:從根節點開始逐層向下遍歷,直至最後一層。對於同一層的節點,由左向右遍歷。
樹的存儲結構:
- 父節點表示法:除根節點外每個節點都有一個指向其父節點的指針,而不要求每個節點具有指向子節點的指針。這種表示法只需要用一維數組來存儲樹的有關信息。
- 子節點表示法
- 樹的子節點-父節點表示法
- 子節點-兄弟表示法:又稱爲二叉鏈表表示法,以二叉鏈表的形式作爲樹的存儲結構。
二叉排序樹:見百度百科
二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹:
- 若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
- 若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
- 左、右子樹也分別爲二叉排序樹;
- 沒有鍵值相等的節點。
幾種特殊的二叉樹:
- AVL樹,即(嚴格)平衡二叉排序樹,滿足以下性質:
- 它的左子樹和右子樹的深度之差的絕對值不超過1
- 它的左、右子樹都是平衡二叉排序樹。
- 紅黑樹:一種非嚴格平衡二叉排序樹。AVL樹與紅黑樹的比較
- 堆:一種特殊的完全二叉樹。堆總是滿足下列性質:
-
堆中某個節點的值總是不大於或不小於其父節點的值;
- 堆總是一棵完全二叉樹。
根節點(堆頂元素)最大的堆叫做最大(值)堆或最大根堆,根節點最小的堆叫做最小(值)堆或最小根堆。
B-樹:多叉平衡查找樹,適合在外存(如磁盤文件)進行數據存儲和查找。