二叉樹基礎(上) 什麼樣的二叉樹適合用陣列來儲存?

2021-09-27 07:08:07 字數 1911 閱讀 1992

其實這段時間一直在刷lc,但是還是感覺樹圖寫的不太行,就重新來學習總結了。

首先提出疑問:二叉樹有哪幾種儲存方式?什麼樣的二叉樹適合用陣列來儲存?

待著問題,然後來學習今天的內容

我們首先來看,什麼是樹?再完備的定義,都沒有圖直觀。所以請看下圖的樹,都有什麼特徵。

裡面的每個實心圓點被我們稱之為節點,用來連線相鄰節點之間的關係,我們叫做「父子關係」。

比如下面這張圖,a就是b的父親,b就是a的孩子,而bcd的父親都是a,所以bcd互為兄弟節點,我們把沒有父節點的節點叫做根節點,也就是圖中的e。我們把沒有子節點的節點叫做葉子節點或者葉節點,比如圖中的ghijkl都是葉子節點。

再簡單介紹下其他的

滿二叉樹

完全二叉樹

滿二叉樹,就是都畫滿了,但是完全二叉樹呢?是不是有點概念混亂?可以對比來看:

估計很快就能看懂,那麼我們就再來**一下二叉樹的由來吧。

要理解二叉樹的由來,又首先需要了解,如何表示(或者儲存一棵二叉樹)

想要儲存一棵二叉樹,我們有兩種方法,一種是基於指標或者引用的二叉鏈式儲存法,一種是基於陣列的順序儲存法。

我們先來看比較簡單、直觀的鏈式儲存法

從圖中應該很清楚的就能看出,每個節點有三個字段,其中乙個儲存資料,另外兩個是指向左右子節點的指標。我們只要拎住根節點,就可以通過左右子節點的指標,把整棵樹都串起來。這種儲存方式我們比較常用。大部分二叉樹**都是通過這種結構來實現的。

然後我們再來看看基於陣列的順序儲存法。我們把根節點儲存在下標i=1的位置,那左子節點儲存在下標2* i = 2的位置,右子節點儲存在2* i+1=3的位置。以此類推,b節點的左子節點儲存在2i=22=4的位置,右子節點儲存在2* i+1=2* 2+1=5的位置。

說白了就是從上往下,從左到右,儲存進去,,,

但是這個例子的限用條件你必須至少是乙個完全二叉樹,這樣不會浪費儲存空間,但是如果你是乙個普通的二叉樹,就會很占用記憶體空間了,如下:

當後面說到堆和堆排的時候,就會發現,堆其實就是一種完全二叉樹,最常用的儲存方式就是陣列。

時間複雜度為o(n)

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...

樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹

目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...

二叉樹,完全二叉樹,滿二叉樹

二叉樹 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。滿二叉樹 一顆深度為k且有2 k 1個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...