聊聊樹與二叉樹

1.什麼是樹

 

    現實生活中的樹就是有一個主幹,加分支加葉子組成的一種植物,大概如下圖所示

 

 

    數據結構中的樹是什麼樣子呢?他就像是一個倒着生長的樹,對照着兩幅圖看,是不是很相似。其中圓圈的位置就是數據存放的地方。

 

 

    每個元素我們叫作“節點”,也就是圖中的每個圈;用來連線相鄰節點之間的關係,我們叫作“父子關係,A 節點就是 B 節點的父節點,B 節點是 A 節點的子節點。B、C、D 這三個節點的父節點是同一個節點,所以它們之間互稱爲兄弟節點。我們把沒有父節點的節點叫作根節點,也就是圖中的節點 E。我們把沒有子節點的節點叫作葉子節點或者葉節點,比如圖中的 G、H、I、J、K、L 都是葉子節點。

 

 

 

 

    還有三個比較相似的概念:高度(Height)、深度(Depth)、層(Level)。它們的定義是這樣的

 

 

 

    實際上節點的高度就是該節點到最下面,也就是葉子節點的最長路徑,高度就比較好理解了一般我們看一個東西有好高都是從小面開始向上計算的,而深度就是從上向下計算,例如水有多深,最上面的肯定就是水面,所以深度是0,而層和深度類似,是樹的深度加1,我們可以這樣理解,一般一棟樓房的層數在都是從下面開始計算的,所以我們可理解成從頂層開始計算的一種樓房。

 

 

2.二叉樹

 

    二叉樹我們從名字上就可以看出來他每一個分叉只能有兩個子節點(也就是一個父節點最多隻能有兩個子節點),分別是左節點和右節點。

 

 

 滿二叉樹

 

    所謂的滿二叉樹就是所有的葉子節點都在同一層,類似於上圖中的圖2,我們也可以爲根據根節點左右能夠對稱的樹叫滿二叉樹。

 

 完全二叉樹

 

    完全二叉樹相比滿二叉樹比較難理解,根據《大話數據結構》書中的解釋,我覺得比較還是比較好理解,我們如果從根節點開始,從左到右定義一個順序的編號,而如果節點是根據順序走的那麼就是完全二叉樹,否則就不是;從下面圖一種可以看出節點是完全根據順序編號走的,而圖二在第三層的時候右邊兩個沒有節點,所以不是根據順序走的,圖三則是第四層第一個節點沒有也不是根據順序走的,圖四第三層按照順序編號第三個節點應該有數據而沒有,所以也不是根據順序編號走的。

 

 

3.二叉樹的存儲方式

 

    二叉樹的存儲方式分爲鏈式和順序存儲兩種,我們可以根據數組來存儲,也可以根據鏈表來存儲,實際中鏈表存儲居多,基本上很少有使用數組來存儲的,鏈式存儲我們可以定義兩個指針,分別指向左右子節點的地址。

 

 

    而數組存儲就比較麻煩了,我們可以定義一個數組而數組中存放當前節點的數據,同時存放自己左右子節點的下標位置,當然這肯定不是一個簡單的基本類型數組,而是一個類的數組,而這個類中存在着這三個變量,左右子節點的下標,以及自己的數據,當然這個時候你可能會說這樣子是不是不太好找到自己的父節點了,那我們可以再加一個存放父節點下標位置的變量,根節點的父節點我們可以存儲0。

 

 

4.二叉樹的遍歷

 

    二叉樹的遍歷可以分爲三種,分別爲前序遍歷、中序遍歷、後續遍歷實際上這三個只是把輸出數據的代碼放在了不同的位置。前序遍歷就是將輸出節點的代碼放在左右子樹之前,而中序遍歷就是放在左子樹遞歸後面,右子樹遞歸前面,也就是放在他倆中間,而後續遍歷就是輸出語句放在左右子樹遞歸之後。

 

 

    最後看看遍歷的時間複雜度,從我前面畫的前、中、後序遍歷的順序圖,可以看出來,每個節點最多會被訪問兩次,所以遍歷操作的時間複雜度,跟節點的個數 n 成正比,也就是說二叉樹遍歷的時間複雜度是 O(n)。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章