常用資料結構 幾種特殊的二叉樹

2021-07-03 01:42:38 字數 3433 閱讀 8746

查詢二叉樹(二叉排序樹)

二叉排序樹(binary sort tree)又稱二叉查詢樹(binary search tree)。其定義為:二叉排序樹或者是空樹,或者是滿足如下性質的二叉樹:

①若它的左子樹非空,則左子樹上所有結點的值均小於根結點的值;

②若它的右子樹非空,則右子樹上所有結點的值均大於根結點的值;

③左、右子樹本身又各是一棵二叉排序樹。

例:

對排序二叉樹的一些操作

查詢:若根結點的關鍵字值等於查詢的關鍵字,成功。

否則,若小於根結點的關鍵字值,遞迴查左子樹。

若大於根結點的關鍵字值,遞迴查右子樹。

若子樹為空,查詢不成功。

插入:分以下幾種情況進行相應的處理:

①如果相同鍵值的結點已在查詢二叉樹中,則不再插入;

②如果查詢二叉樹為空樹,則以新結點為查詢二叉樹;

③將要插入結點的鍵值與插入後的父結點的鍵值比較,就能確定新結點是父結點的左子結點,還是右子結點,並進行相應插入,新插入的結點一定是乙個新新增的葉子結點。

刪除:分以下幾種情況進行相應的處理:

①若待刪除的結點p是葉子結點,則直接刪除該結點;

②若待刪除的結點p只有乙個子節點,則將這個子結點與待刪除結點的父結點直接連線,然後刪除節點p;

③若待刪除的結點p有兩個子結點,則在其左子樹上,用中序遍歷尋找關健值最大的結點s,用結點s的值代替結點p的值,然後刪除節點s,結點s必屬於上述①、②情況之一。

例:刪除圖1中的根結點5

首先,中序遍歷結點5的左子樹,獲得最大的結點s=4,將p=5和s=4互換位置,發現要刪除的p結點屬於第①種情況,則直接刪除p=5結點。

最優二叉樹(哈夫曼樹)

最優二叉樹是帶權路徑長度最小的樹。

基本術語

樹的路徑長度:是從樹根到樹中每乙個結點的路徑長度之和。在結點數目相同的二叉樹中,完全二叉樹的路徑長度最短。

結點的權:根據應用的需要給樹的結點賦的權值。

帶權路徑長度:結點到樹根之間的路徑長度與該結點上權的乘積,稱為結點的帶權路徑長度。

樹的帶權路徑長度(樹的代價):樹中所有葉結點的帶權路徑長度之和,稱為樹的代價。

構造哈夫曼樹

哈弗曼編碼

求出哈夫曼樹後,以上圖為例,只需人為規定左側為0,右側為1,那麼結點23的編碼是:00;結點11的編碼是:010。哈夫曼編碼是一種應用廣泛且非常有效的資料壓縮技術,該技術一般可將資料檔案壓縮掉20%-90%,其壓縮效率取決於被壓縮檔案的特徵。

線索二叉樹

二叉樹的遍歷本質上是將乙個複雜的非線性結構轉換為線性結構,使每個結點都有了唯一前驅和後繼(第乙個結點無前驅,最後乙個結點無後繼)。對於二叉樹的乙個結點,查詢其左右子女是方便的,其前驅後繼只有在遍歷中得到。為了容易找到前驅和後繼,有兩種方法。一是在結點結構中增加向前和向後的指標fwd和bkd,這種方法增加了儲存開銷,不可取;二是利用二叉樹的空鏈指標。現將二叉樹的結點結構重新定義如下:

對於標誌域規定如下:

lbit=0,lchild是通常的指正;lbit=1,lchild是線索;

rbit=0,rchild是通常的指標;rbit=1,rchild是線索;

將二叉樹轉化為線索二叉樹

第一步:將將二叉樹的前序遍歷、中序遍歷、後序遍歷的順序寫下來;

下圖前序遍歷順序:a b d e h c f g i

中序遍歷:d b h e a f c g i

後序遍歷:d h e b f i g c a

第二步:參照遍歷的順序,找到各個結點對應的前驅和後驅,如下圖:

綠色線表示前驅;紅色線表示後驅。

上面提到線索二叉樹的使用就是為了方便的找到前驅和後驅,對於中序遍歷,右指標為空的結點d e h f i,利用線索(紅色箭頭)可以直接標識出該結點的後驅;但對於右指標非空的普通的結點b、a、c、g,它的後繼是右子樹最左下的結點,比如b的後繼結點為h,a的後繼結點為f,因此,中序遍歷中找後驅分為兩種情況。

後序線索二叉樹找後驅可分為三種情況,第一種:根結點後序為null;

第二種,如果乙個結點為父結點的右孩子或父結點的左孩子(父結點沒有右子樹),他的後繼就是父結點;比如c的後驅為a結點。

第三種,如果結點是父節點的左孩子,而且父結點有右孩子,那麼後繼為父結點的右子樹按後序遍歷列出的第乙個結點。比如b結點的後繼結點為f結點。

平衡二叉樹

定義:一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。平衡二叉樹的提出大大降低了操作的時間複雜度。

動態調平衡

ll型平衡旋轉(單向右旋平衡處理)

rr型平衡旋轉(單向左旋轉平衡處理)

lr型平衡旋轉(雙向旋轉,先左後右)

rl型平衡旋轉(雙向旋轉,先右後左)

再補充乙個堆,其實一般所說的堆就是一棵完全二叉樹。

定義:n個元素的序列當滿足下列關係關係時,稱為堆:

ki <= k2i 且 ki <= k2i+1或者ki>=k2i且ki>=k2i+1;

定義比較抽象,舉例說明:

ki <= k2i 且 ki <= k2i+1:以上圖為例,1結點 < 2結點且1結點 < 3結點,下面子樹同樣成立(孩子結點大於父結點),因此這類完全二叉樹就被稱為小根堆;

如果有一棵完全二叉樹符合ki>=k2i且ki>=k2i+1(和上面類似,不演示例子),孩子結點小於父結點,這類二叉樹被稱為大根堆。

特性

對於結點i,i>=n/2時,表示結點i為葉子結點。

幾種特殊的二叉樹

二叉樹 有序樹,左右孩子不能顛倒 1 滿二叉樹 對於h層的結點有2 h 1個結點。葉子結點都集中在最下面一層,除了葉子結點,每個結點都有左右孩子。2 完全二叉樹 對於乙個高為h有n個結點的二叉樹,當且僅當每乙個結點都與高度為h的滿二叉樹中編號為1 n的結點一一對應。葉子結點集中在最下面兩層,並且如果...

資料結構 二叉樹 反轉二叉樹

include using namespace std define maxsize 1000 struct binary tree node class queue queue queue void queue push binary tree node btn binary tree node ...

《資料結構》 二叉樹

二叉樹 是 n個結點的有限集,它或為空集,或由乙個根結點及兩棵互不相交的 分別稱為該根的左子樹和右子樹的二叉樹組成。二叉樹不是樹的特殊情況,這是兩種不同的資料結構 它與無序樹和度為 2的有序樹不同。二叉樹的性質 1 二叉樹第 i層上的結點數最多為 2 i 1 2 深度為 k的二叉樹至多有 2 k 1...