1. 程式人生 > >java中的資料結構——樹

java中的資料結構——樹

樹形結構是一種層級式的資料結構,由節點和連線它們的邊組成, java語言編寫的程式中常常用引用來表示邊。根是樹中頂端的節 點:它沒有父節點。節點表示儲存在樹中的資料物件。非平衡樹是 指根左邊的後代比右邊多,或者相反。 區分樹和圖的主要特徵是樹中不存在環路。
樹的節點 Root,parent,child,leaf,sibling 。
樹的主要型別 N元樹 平衡樹 二叉樹 二叉搜尋樹 AVL樹 紅黑樹 2-3樹(多叉樹比二叉樹有更多的關鍵字和子節點)。
樹通常結合了有序陣列和連結串列兩種資料結構的優點,在樹中查詢數 據項的速度和在有序陣列中查詢一樣快,並且插入資料項和刪除數 據項的速度也和連結串列一樣。 其中,二叉樹和二叉搜尋樹是常用的樹。二叉樹指樹中每個節點 多隻能有兩個子節點,二叉搜尋樹指一個節點的左子節點的關鍵 字值小於這個節點,右子節點的關鍵字的值大於或等於這個父節 點。 查詢節點需要比較要找的關鍵字值和節點的關鍵字值,插入需要找 到要插入新節點的位置並改變他父節點的子欄位來指向它。如果一 個節點沒有子節點,刪除它只要把它的父節點的子欄位置為null即 可,如果一個節點有一個子節點,把它父節點的子欄位置為它的子 節點就可以刪除它,如果一個節點有兩個子節點,刪除它要用他的 後繼(該節點的右子節點為根的子樹中關鍵值小的那個節點)來 代替他。可以用陣列表示樹,不過基於引用的方法更常用。

二叉樹的效率:
樹的大部分操作都需要從上到下一層一層的查詢某個節點,因此常 見樹的操作(查詢,插入,刪除)時間複雜度大約是O(logN),如 果樹不滿,分析起來很困難,不過,可以認為對給定層數的樹,不 滿的樹的平均查詢時間比滿樹要短,因為在它的較低的層上完成查 找的次數要比滿樹時少。 樹對所有常用的資料儲存操作都有很高的效率,遍歷不如其他操作 快,但是,遍歷在大型資料庫中不是常用的操作。
B樹是多叉樹,每個節點可以有幾十或上百個關鍵字和節點,B樹中 子節點的個數總是比關鍵字的個數多1,為達到好的效能,B樹通 常在一個節點中儲存一塊的資料。

實戰

在控制檯上輸入一組資料,按照輸入資料的格式來構造一棵二叉樹,並打印出二叉樹的高度。
輸入的資料格式如下:
12
2 3
2 11
3 4
3 5
11 12
11 13
4 6
5 7
12 14
12 15
14 16
16 17
用二叉樹表示如下:
在這裡插入圖片描述

Java程式碼實現如下:
在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

輸出結果為:
在這裡插入圖片描述

紅黑樹
普通的二叉搜尋樹可以快速的找到一個給定關鍵字的資料項,可以快速的插入和刪除資料,如果二叉搜尋樹中插入的是隨機資料,執行效果很好,但是如果插入的是有序的資料或逆序的資料,速度就會變得特別慢,因為插入的數值有序時,二叉樹就是非平衡的了,而對於非平衡樹,它的快速查詢,插入,刪除,指定資料項的能力就喪失了。紅黑樹是增加了某些特點(在紅黑平衡的方法中,每個節點都有一個新的特徵:它的顏色不是紅的就是黑的)的二叉搜尋樹,它將解決這個問題。
效率:
在紅黑樹中的查詢時間和在普通二叉樹中的查詢時間幾乎完全一樣,因為在查詢的過程中並沒有應用紅黑樹的特徵,額外的開銷只是每一個節點的儲存空間都稍微增加了一點來儲存紅黑的顏色(一個boolean變數)。插入和刪除的時間要增加一個常數因子,因為不得不在下行的路徑上和插入點執行顏色變換和旋轉。平均起來,一次插入大約需要一次旋轉,但是比在普通的二叉搜尋樹中要慢。因為在大多數應用中,查詢的次數比插入和刪除的次數多,所以應用紅黑樹取代普通的二叉搜尋樹總體上不會增加太多的時間開銷,紅黑樹的優點是對有些資料的操作不會慢到O(N)的時間複雜度。
總結:保持普通二叉樹的平衡是非常重要的,這樣可以使找到給定節點必需的時間儘可能短,在二叉樹中加入紅黑平衡對平均執行效率只有很小的負面影響,卻避免了對有序的資料操作的最壞的效能。

上一篇:java中的資料結構——連結串列