一本正經的聊資料結構(4) 樹

2022-03-17 18:26:38 字數 1781 閱讀 3643

前文傳送門:

「一本正經的聊資料結構(1):時間複雜度」

「一本正經的聊資料結構(2):陣列與向量」

「一本正經的聊資料結構(3):棧和佇列」

在前面的文章中,我們已經陸陸續續的介紹了一些資料結構。

根據這些資料結構的實現方式,大體上可以分成兩類:基於陣列的實現和基於鍊錶的實現。

這兩種實現方式各有優缺點,說不上誰一定好誰一定不好,需要根據具體的使用場景進行選型。

基於陣列的實現方式,這種方式允許我們通過下標在常數的時間內找到目標物件,但是如果需要對這種結構進行修改,無論是插入還是刪除,都需要耗費線性的時間。

基於鍊錶的實現方式,這種實現方式允許我們借助位置物件,在常數的時間內插入或者刪除元素,但是如果想要找到某個元素,那麼不得不耗費線性的時間。

基於上面這兩點,我們可以知道,如果當前的場景是修改遠大於查詢,那麼選擇鍊錶的資料結構會比較好。

反過來如果是查詢遠大於修改,那麼選擇陣列的資料結構會比較好。

上面這段沒看懂的,可以翻翻前面的文章然後去面壁思過了。

前面這些資料結構,元素之間都有乙個自然的線型的關係,所以他們都都被稱為線型結構。

而我們從本篇開始介紹的樹就不一樣了,樹的元素之間並不會有直接的直接前驅或者直接後繼這種關係,但是,只要是加上某種約束條件,也是可以在樹的元素之間確定某種線型次序,所以樹這種結構被稱為半線型結構。

先來看下樹結構長啥樣:

樹這種結構非常像乙個樹倒過來,所以因此而得名。

一些基礎概念:

二叉樹是樹結構的一種樹,也是我們接觸最多使用最為廣泛的一種樹結構。

簡單地理解,滿足以下兩個條件的樹就是二叉樹:

結果就是長這樣的:

簡單來講就是每個節點下面最多只能有兩個分叉,超過兩個就不叫二叉樹了,比如右邊這個或許可以叫三叉樹(這個沒人定義過啊,我就這麼一瞎說)?

二叉樹的幾個特性:

這兩個特性的推導過程就不拆開講了,基本上有初中數學基礎的應該都能看得懂。

二叉樹還可以接著分類,進而衍生出了滿二叉樹和完全二叉樹。

滿二叉樹就是除了葉子結點,每個結點的度都為 2 。

簡單來講就是所有的節點都插滿了,比如下面這樣的:

滿二叉樹除了具有二叉樹的特性外,還有一些單獨的特性:

如果二叉樹中除去最後一層節點為滿二叉樹,且最後一層的結點依次從左到右分布,則此二叉樹被稱為完全二叉樹。

這個意思就是完全二叉樹是滿二叉樹的不完全體,只要最後一層滿足了從左至右排布以及其餘層次都是滿二叉樹,那麼這個就叫做完全二叉樹,比如下面這樣的:

圖 b 不是完全二叉樹的原因就是因為它的最後一層並不是從左至右排布的,這個要清楚。

完全二叉樹也有一些自己獨特的性質,如:

本篇的內容就先到這裡了,通過本篇的內容,應該對數和二叉樹有乙個初步的認知,能夠清楚的了解樹和二叉樹的結構以及一些二叉樹的基礎的特性。

從下篇內容開始,我們介紹二叉樹的乙個關鍵知識點:實現與遍歷。

一本正經的聊資料結構(3) 棧和佇列

前文傳送門 一本正經的聊資料結構 1 時間複雜度 一本正經的聊資料結構 2 陣列與向量 前一篇內容我們介紹了陣列和向量,雖然說向量是陣列的乙個公升級版,但是在另乙個維度上,他們都屬於線性結構。那麼什麼是線性結構呢?線性結構是乙個有序資料元素的集合。常用的線性結構有 線性表,棧,佇列,雙佇列,陣列,串...

一本正經的說kafka的結構

kafka 從字面意思,可以看出來就是 ka f ka 是乙個有序的 檔案 訊息佇列進什麼出什麼 kafka 從logo上可以看到 他是乙個分布式的結構 乙個大節點 管理幾個小節點 乙個 zookeeper 管理 和 多個 broker 程序節點 多台機器 乙個 topic 和 多個 partiti...

暴風雪俱樂部好玩嗎?一本正經在做推理的推理遊戲

隨著遊戲開發技術的不斷進步,遊戲的表達方式也變得多種多樣,然而如何去做偵探類遊戲,就我接觸到的遊戲來看,手遊似乎侷限於小螢幕和程式編寫,在如何表達破案分析www.cppcns.com過程和如何表達故事方面仍然舉步維艱。在這種情況下,暴風雪俱樂部的出現,無疑應該獲得關注。卡片可以任意旋轉,右側為俱樂部...