Java- 資料結構之樹
阿新 • • 發佈:2022-04-04
樹:
- 模仿為我們現實生活中的案例生成的資料結構叫做樹,Tree是由根節點和子節點組成的
二叉樹的便利:前序遍歷,中序遍歷,後序遍歷,這裡的前中後指的是根節點出現的順序;
哈夫曼樹(最優二叉樹)
1.相關名詞:路徑,路徑長度,節點的權,節點的帶權路徑長度。
- 路徑:在一棵樹中,一個結點到另一個結點之間的通路,稱為路徑
- 路徑長度:在一條路徑中,每經過一個結點,路徑長度都要加 1 。例如在一棵樹中,規定根結點所在層數為1層,那麼從根結點到第 i 層結點的路徑長度為 i - 1
- 結點的權:給每一個結點賦予一個新的數值,被稱為這個結點的權。
- 結點的帶權路徑長度:指的是從根結點到該結點之間的路徑長度與該結點的權的乘積、
什麼是哈夫曼樹?
++當用 n 個結點(都做葉子結點且都有各自的權值)試圖構建一棵樹時,如果構建的這棵樹的帶權路徑長度最小,稱這棵樹為“最優二叉樹”,有時也叫“赫夫曼樹”或者“哈夫曼樹”。++
如何構建哈夫曼數?
在構建哈弗曼樹時,要使樹的帶權路徑長度最小,只需要遵循一個原則,那就是:權重越大的結點離樹根越近。在圖 1 中,因為結點 a 的權值最大,所以理應直接作為根結點的孩子結點。
哈夫曼樹的構建過程(重點):
對於給定的有各自權值的 n個結點,構建哈夫曼樹有一個行之有效的辦法:
- 在 n 個權值中選出兩個最小的權值,對應的兩個結點組成一個新的二叉樹,且新二叉樹的根結點的權值為左右孩子權值的和;
- 在原有的 n 個權值中刪除那兩個最小的權值,同時將新的權值加入到 n–2 個權值的行列中,以此類推;
- 重複 1 和 2 ,直到所以的結點構建成了一棵二叉樹為止,這棵樹就是哈夫曼樹。
二叉樹:
特性:
- 1、左子樹上所有節點的值均小於它的根節點的值;
- 2、右子樹上所有節點的值均大於它的根節點的值;
- 3、左、右子樹也分別為二叉排序樹。但是一個不好會形成連結串列結構,比如一個有序陣列形成的二叉樹
平衡二叉樹
特點
- 1、在二叉樹的基礎上,要求兩個子樹的高度差不能超過1;
- 2、每次增刪都會通過一次或多次旋轉來平衡二叉樹;
調整平衡的基本思想
紅黑樹
特性
- 1、根節點是黑色;
- 2、每個節點或者是黑色,或者是紅色;
- 3、每個葉子節點是黑色。 [注意:這裡葉子節點,是指為空的葉子節點!;
- 4、如果一個節點是紅色的,則它的子節點必須是黑色的,也就是說一個紅節點的父節點只能是黑色
- 5、從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點,也就是說確保沒有一條路徑會比其他路徑長出倆倍