天天看點

資料結構學習:平衡二叉樹和哈夫曼樹

資料結構學習:平衡二叉樹和哈夫曼樹

平衡二叉樹:

樹上任一結點的左子樹和右子樹的深度之差不超過1

結點的平衡因子 = 左子樹高 - 右子樹高

是以平衡二叉樹結點的平衡因子絕對值小于等于1

平衡二叉樹的插入

從插入點往回找第一個不平衡結點,調整以該結點為根的子樹

最小不平衡子樹:

從插入點往回找第一個不平衡結點,以該結點為根的子樹

在插入操作中,隻要将最小不平衡子樹調整為平衡,則其他祖先結點都會恢複平衡

調整最小不平衡子樹

目标:

1.恢複平衡

2.保持二叉排序樹的特性

調整最小不平衡子樹A

LL: 在A的左孩子的左子樹中插入導緻不平衡
RR: 在A的右孩子的右子樹中插入導緻不平衡
LR: 在A的左孩子的右子樹中插入導緻不平衡
RL:在A的右孩子的左子樹中插入導緻不平衡
           

1)LL平衡旋轉(右單旋轉)。

由于在結點A的左孩子(L)的左子樹((L)上插入了新結點,A的平衡因子由1增至2,導緻以A為根的子樹失去平衡,需要一次向右的旋轉操作。

将A的左孩子B向右上旋轉代替A成為根結點,将A結點向右下旋轉成為B的右子樹的根結點,而B的原右子樹則作為A結點的左子樹。

Eg:

資料結構學習:平衡二叉樹和哈夫曼樹

代碼思路:

資料結構學習:平衡二叉樹和哈夫曼樹

2)RR平衡旋轉(左單旋轉)。

由于在結點A的右孩子(R)的右子樹®上插入了新結點,A的平衡因子由-1減至-2,導緻以A為根的子樹失去平衡,需要一次向左的旋轉操作。

将A的右孩子向左上旋轉代替A成為根結點信将A結點向在下旋轉戊為B的左子樹的根結點,而B的原左子樹則作為A結點的右子樹

資料結構學習:平衡二叉樹和哈夫曼樹

代碼思路:

資料結構學習:平衡二叉樹和哈夫曼樹

3)LR平衡旋轉(先左後右雙旋轉)。

由于在A的左孩子(L)的右子樹®上插入新結點,A的平衡因子由1增至2,導緻以A為根的子樹失去平衡,需要進行兩次旋轉操作,先左旋轉後右旋轉。

先将A結點的左孩子B的右子樹的根結點C向左上旋轉提升到B結點的位置,然後再把該C結點向右上旋轉提升到A結點的位置

資料結構學習:平衡二叉樹和哈夫曼樹

4)RL平衡旋轉(先右後左雙旋轉)。

由于在A的右孩子(R)的左子樹(L)上插入新結點,A的平衡因子由-1減至-2,導緻以A為根的子樹失去平衡,需要進行兩次旋轉操作,先右旋轉後左旋轉。

先将A結點的右孩子B的左子樹的根結點C向右上旋轉提升到B結點的位置,然後再把該C結點向左上旋轉提升到A結點的位置

資料結構學習:平衡二叉樹和哈夫曼樹
資料結構學習:平衡二叉樹和哈夫曼樹

哈夫曼樹

結點的權:

有某種現實含義的數值

結點的帶權路徑長度:

從樹的根節點到該結點的路徑長度(經過的邊數)與該結點上權值的乘積

樹的帶權路徑長度:

樹中所有葉結點的帶權路徑長度之和(WPL)

資料結構學習:平衡二叉樹和哈夫曼樹

在含有n個帶權葉結點的二叉樹中,其中帶權路徑長度WPL最小的二叉樹成為哈夫曼樹

也稱為最優二叉樹

哈夫曼樹的構造

給定n個權值分别為w1, w2… wn,的結點,構造哈夫曼樹的算法描述如下:

1)将這n個結點分别作為n棵僅含一個結點的二叉樹,構成森林F.

2)構造一個新結點,從F中選取兩棵根結點權值最小的樹作為新結點的左、右子樹,并且将新結點的權值置為左、右子樹上根結點的權值之和。

3) 從F中删除剛才選出的兩棵樹,同時将新得到的樹加入F中。

4)重複步驟2)和3),直至F中隻剩下一棵樹為止。

特點:

1)每個初始結點最終都成為葉結點,且權值越小的結點到根節點的路徑長度越大

2)哈夫曼樹的結點總數為2n-1

3)哈夫曼樹中不存在度為1的結點

4)哈夫曼樹不唯一,但WPL必然相同且為最優

固定長度編碼:

每個字元用相等長度的二進制位表示

可變長度編碼:

允許對不同字元用不等長的二進制位表示

若沒有一個編碼是另一個編碼的字首,則這樣的編碼為字首編碼

繼續閱讀