數據結構C語言 part5 樹與二叉樹

十一月開頭,這幾天,有點自閉,逐漸意識到了大學能夠給我的非常侷限,很多事情,終究是要靠自己。怠惰,終究會害到自己。爲了儘快擺脫這種頹靡的狀態,於是決定在接下來一段時間,更一下博客。

————————————————————————————————————————————————分界線

樹(Tree)是n(n≥0)個結點的有限集,它或爲空樹(n = 0);或爲非空樹,對於非空樹T:

(1)有且僅有一個稱之爲根的結點;

(2)除根結點以外的其餘結點可分爲m(m>0)個互不相交的有限集T1, T2, …, Tm, 其中每一個集合本身又是一棵樹,並且稱爲根的子樹(SubTree)。

對於樹,我們要明白一些最基本的術語:根節點(root),葉子(終端節點),森林(多顆不相交的數構成的集合),有序樹(對於一個節點的子樹,從左到右爲其順序,不可交換,比如二叉樹),無序樹,前驅結點,後繼節點(孩子),兄弟,堂兄弟,組先(從根節點下來的所有分支節點的集合),子孫,節點的度,樹的度(子樹的個數,分支的個數),節點的層次,樹的深度,分支節點。

而一般的樹並不是我們研究的重點,我們研究的主要還是二叉樹Binary Tree。爲什麼呢?普通樹(多叉樹)若不轉化爲二叉樹,則運算很難實現。那二叉樹有那些特徵呢?

1-節點的度,一定小於等於2

2-他是有序樹,左右子樹不可顛倒。

 

二叉樹可以實現很多功能,比如霍夫曼樹實現數據壓縮,二叉樹來求表達式的值,

二叉樹的一些有趣的性質:

1-對於任何一顆二叉樹,我們根據度數分爲n0,n1,n2.那麼一定有N=n0+n1+n2,並且如果二度的節點有n2個,葉子(0度節點)必定爲n2+1.那麼我們再看,n2+n0=2n2+1了,它必定是個奇數。

對於二叉樹也有分類:

到此,我們可以出一道思考題了。

棵完全二叉樹有5000個結點,可以計算出其葉結點的個數是(         )。

2-對完全二叉樹,若從上至下、從左至右編號,則編號爲i 的結點,其左孩子編號必爲2i,其右孩子編號必爲2i+1;其雙親的編號必爲i/2。

3- 具有n個結點的完全二叉樹的深度必爲[log2n]+1,因爲完全二叉樹是有序的,而且前面都不缺省,用對數的思想,或者說,你可以數學歸納來想這個簡單的問題。

現在讓我們言歸正傳,二叉樹這個數據結構的存儲的實現:

                                                                      順序存儲:(非完全二叉樹,缺省部分置一個特殊缺省值,比如0)

另外可以用鏈式存儲結構:

                                                                                  比如二叉鏈表:

於是我們有可以出一道思考題:在n個結點的二叉鏈表中,有 _____個空指針域。

這種方式只能從上往下,於是我們可以引入一個父代節點指針,這樣就美名爲三叉鏈表了。

————————————————————————————————遍歷和代碼實現我們有空再來看看。

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