到現在為止,前幾天的內容集中在了解線性數列的資料結構。換個方向想:
Array
,彼此相連,可以快速取得對應的資料。缺點一次需要的記憶體空間較多,如果空間不足就必須另外請求,直到取得適合的空間才能繼續執行。Linked List
,藉由儲存資料與下一個節點的記憶體位置,有效串起成數列。但要想想,這樣足夠嗎?一次只能找尋一個資料,會不會太慢?假如數列有一萬筆,我們要的資料剛好是第 5566 筆,每次查詢只能從頭開始一個一個找,效率上令人質疑。於是有人想出,同樣的數目下,是否能讓一個資料連結 2 筆、 3 筆以上的資料?
這個想法經過長期的研究後,最終變成資料結構的基礎知識: Tree
。
Tree
的基本是的,真實世界的 組織圖 就是最好的範例。
基本上,為了簡化設計上的難度,統一每個節點能夠擁有的最大節點數量,會比較好設計。
換個方向思考:
每增加一個節點,表示每個節點要儲存的資訊量會增加:
名稱 | 基本儲存資訊 | 與 Linked List 比較 |
---|---|---|
Linked List |
資料、一個子節點的指標 | |
二元樹(Binary Tree ) |
資料、兩個子節點的指標 | 多了一個子節點 |
四元樹(Quadtree ) |
資料、四個子節點的指標 | 多了三個子節點 |
八元樹(Octree ) |
資料、八個子節點的指標 | 多了七個子節點 |
子節點的數量增加,節點需要的記憶體空間會增加,假設需要的資料是在第三層:
由此可知,除非是需要在一個節點上取得多筆節點資訊,例如地形系統,在繪製時需要取得每一點的多筆資訊才能正確繪製出會面。不然在一般情況上,大多會採用二元樹,避免過多記憶體被浪費掉。
簡單介紹 Tree
的基本概念後,明天要進入 Tree
家族的重頭戲,Binary Tree
。
順道一提,LeetCode 的 Tag 為 Tree 的題目,大多以 Binary Tree
為概念在設計題目,藉由此件事可以推論,在程式設計領域中,提起 Tree
要自然而然想到 Binary Tree
。