章節簡介
前5篇博客寫的都是線性結構,對於有層級結構的數據需要用樹形結構來描述
本章的重要知識點
- 理解有關樹的基本概念和二叉樹的基本概念
- 掌握二叉樹的存儲結構以及遍歷方法
- 掌握樹的存儲結構以及樹、森林、二叉樹的相互轉換方法
- 梳理掌握哈夫曼樹構造方法和哈夫曼編碼的設計方法
樹的基本概念
核心一句話
線性結構中一個結點至多隻有一個直接後繼,樹形結構一個結點可以有一個或多個直接後繼
認識樹
看圖即可,你要能區分出來哪些是樹,哪些不是樹
樹的相關術語
- 結點的度:樹上任意結點所擁有的子樹的數目稱爲該結點的度
- 葉子:度爲0的結點稱爲葉子或者終端結點
- 樹的度:一棵樹中所有結點的度的最大值稱爲該樹的度,就是把所有結點的度求和
- 結點的層次:從根算起,根的層次爲1,其餘結點的層次爲其雙親的層次加1
- 樹的高度:一棵樹中所有結點層次數的最大值稱爲該樹的高度或
深度
- 還有一些小概念:有序樹、無序樹
樹的相關術語,一定要一開始就明確清晰,後面纔好學習
二叉樹
官方概念:二叉樹是n(n≥0)個元素的有限集合,該集合或者爲空,或者由一個根及兩棵互不相交的左子樹和右子樹組成,其中左子樹和右子樹也均爲二叉樹。二叉樹的任一結點都有兩棵子樹(它們中的任何一個都可以是空子樹
),並且這兩棵子樹之間有次序關係,交換位置就成爲一棵不同的二叉樹。
左子樹和右子樹,也有的叫做左孩子和右孩子
二叉樹五種基本形態,方塊表示子樹
二叉樹的基本運算(不寫代碼,瞭解重點函數即可)
- 初始化
- 求雙親
- 求左孩子
- 求右孩子
- 建二叉樹
- 先序遍歷!!!
- 中序遍歷!!!
- 後序遍歷!!!
- 層次遍歷!!!
先序遍歷,中序遍歷,後序遍歷在考試中一般不要求手寫代碼,但是需要你能通過一棵樹結構,輸出最終的結果,這個博客結尾給大家看一下例題
二叉樹性質(很重要,細碎知識點很多)
性質1:二叉樹第i(i≥1)層上至多有2i-1個結點。
不需要死記硬背,實際需要的時候畫一個二叉樹就可以求出來了
性質2:深度爲k(k≥1)的二叉樹至多有2k-1個結點
依舊可以推導出來
深度爲1的二叉樹 結點最多爲1
深度爲2的二叉樹 結點最多爲3
深度爲3的二叉樹 結點最多爲7
深度爲k的二叉樹 結點最多爲2k-1
性質3:對任何一棵二叉樹,若度數爲0的結點(葉結點)個數爲n0,度數爲2的結點個數爲n2,則n0 = n2+1
這個性質需要稍微推導一下
先回答一個問題,你知道樹的度數,怎麼計算樹的結點數
例如 樹的度數爲2,結點樹爲幾,這個不難想象,會出現如下情況
看到這裏不難發現,存在一個公式爲 樹的度數+1=樹的結點樹
那麼我們開始推導上述公式
假設 二叉樹的0度,1度,2度結點個數爲n0,n1,n2,結點總數爲T
T = n0+n1+n2
樹的度數+1 = T
樹的度數怎麼求?n0*0+n1*1+n2*2 是樹的度數
繼續n0*0+n1*1+n2*2 +1 = T = n0+n1+n2
===> 2n2+1=n0+n2
===>n0=n2+1
好了,上述過程,爭取看明白吧
性質4:含有n個結點的完全二叉樹的深度爲𠃊log2n𠃎+1
這個地方引出了一個新的概念
完全二叉樹
說明什麼是完全二叉樹之前,需要理解什麼是滿二叉樹
滿二叉樹
深度爲k(k≥1)且有2k-1個結點的二叉樹稱爲滿二叉樹
完全二叉樹
如果對滿二叉樹按從上到下,從左到右的順序編號,並在最下一層刪除去部分結點(刪除最後一層仍有結點),如果刪除的這些結點的編號是連續的且刪除的結點中含有最大編號的結點,那麼這棵二叉樹就是完全二叉樹
注意 𠃊x𠃎
這個符號,表示不大於x的最大整數
教材中,給了幾個範例,偷懶我用一下
關於性質4的證明,有興趣的自行研究一下吧
性質5:如果將一棵有n個結點的完全二叉樹按層編號
,按層編號是指:將一棵二叉樹中的所有n個結點按照從第一層到最大層,每層從左到右的順序依次標記爲1,2,…,n。則對任意編號i(1≤i≤n)的結點A有:
(1)若i=1,則結點A是根;若i>1,則A的雙親編號爲 𠃊i/2𠃎
。(注意 𠃊x𠃎
這個符號,表示不大於x的最大整數)
(2)若2*i>n,則結點A既無左孩子,也無右孩子;否則A的左孩子的編號爲2*i。
(3)若2*i+1>n,則結點A無右孩子;否則,A的右孩子編號爲2*i+1;
這個性質5有點意思,先驗證一下
所以這個性質稍微配合着圖看一下就可以完美學會
二叉樹存儲結構
二叉樹也是兩類存儲結構:順序存儲和鏈式存儲
先看順序存儲結構
這個地方對於初學者你來說,理解即可
對一棵完全二叉樹上的所有結點按層編號,然後按照編號存儲到一維數組裏面即可。
書中有個比較好的例子了,直接截圖,理解一下
重點是下面,如果一個樹不是完全二叉樹咋辦
教材中給的方案是,添加虛擬結點,說白了,就是湊成完全二叉樹,不過注意這種解決方案缺點就是浪費空間
二叉樹的鏈式存儲,記住常用的叫做 二叉鏈表 和 三叉鏈表 即可,其他的在自考和期末考試中不是重點部分,選擇性的看不到吧。
二叉樹的遍歷
這個有點意思了,是考試的重點,但是不是叫你寫代碼哦~而是手動遍歷。
請注意,二叉樹遍歷有六種可能,我們核心關注三種
分別是
- 先序遍歷
- 中序遍歷
- 後序遍歷
直接看圖解釋吧,先畫一個二叉樹
爲了解決遍歷問題,你要先劃分好區域,找到左子樹、右子樹還有根
先序遍歷走起
- 訪問根結點 (根結點在開頭)
- 先序遍歷左子樹
- 先序遍歷右子樹
中序遍歷走起
4. 中序遍歷左子樹
5. 訪問根結點 (根結點在中間)
6. 中序遍歷右子樹
後序遍歷走起
- 後序遍歷左子樹
- 後序遍歷右子樹
- 訪問根結點(根結點在後頭)
這種題就多練就可以啦~
當然還有一種需要會,叫做二叉樹的按層遍歷,這個就比較簡單了,自行學習一下就可以掌握
自考真題
二叉樹遍歷在自考中是一個比較重要的題目,來幾道真題吧
在評論區寫上你的答案吧
與夢想老師建立關係時間
更多內容,歡迎關注 https://dwz.cn/r4lCXEuL