野生前端的資料結構基礎練習(7)——二叉樹
網上的相關教程非常多,基礎知識自行搜尋即可。
習題主要選自Orelly出版的《資料結構與演算法javascript描述》一書。
參考程式碼可見:https://github.com/dashnowords/blogs/tree/master/Structure/btree
一.二叉樹的基本知識
基本概念
一棵樹最上面的點稱為根節點
,如果一個節點下面連線多個節點,那麼該節點稱為父節點
,下面的節點稱為子節點
,二叉樹的每一個節點最多有2個子節點,一個節點子節點的個數稱為度
,二叉樹每個節點的度只能是0,1,2中的一個,度為0的節點稱為葉節點
。
基本特點
二叉查詢樹是一種特殊的二叉樹,其插入查詢和刪除都非常高效。
二.基本練習
-
實現
二叉查詢樹(BST)
TIP:
BST
在插入資料時的邏輯,本身就是一種二分法思維。 -
樹的遍歷
TIP:樹的遍歷一般分為先序遍歷,中序遍歷,後序遍歷,這裡的序是指對於一個節點以及它的左子節點和右子節點的訪問次序。具體使用場景的例子包括:先序遍歷時,可以用於檢視樹結構,中序遍歷,可以用於顯示排序結果,後序遍歷,可用於計算目錄內檔案佔用的資料大小。
-
值的查詢
3.1查詢給定值
TIP:實際上就是二分法查詢
3.2查詢最小值
TIP:
BST
中最左側的節點。3.3查詢最大值
TIP:
BST
中最右側的節點。 -
刪除節點
TIP:主要注意刪除同時包含左右孩子節點的節點時邏輯,由
BST
- 計數
三.課後習題(書中第十節習題)
- 為
BST
增加一個新方法,返回BST
中節點個數。 - 為
BST
增加一個新方法,返回BST
中邊的個數。 - 為
BST
類增加一個新方法max( )
,返回最大值。 - 為
BST
類增加一個新方法min( )
,返回最小值。 - 寫一段程式,讀入一個較大的文字檔案,並將其中的單詞儲存到
BST
中,顯示每個單詞出現的次數
四.習題思路
- 在
BST
建構函式中增加一個count
count
值實現計數即可。 BST
邊的數量比節點數量少1.- (略)
- (略)
- 分解出的單詞實際上就是字串,字串的比較實際上就是從第一位開始逐個比較ASCII碼,用上面實現的
BST
做練習就好,詞頻統計更多會用到Trie
樹,也就是字典樹,感興趣的讀者可以自行查閱。
五. 根據遍歷序還原二叉樹
【先序+中序】或者【後序+中序】都可以還原出唯一的二叉樹,只根據【先序+後序】還原出的二叉樹不是唯一的(感興趣的可以看看這篇《 為什麼只給出前序和後序,不能唯一確定一個二叉樹 》),這裡的二叉樹指的是一般二叉樹,不是二叉搜尋樹。或者相關的文章已經很多了,隨手貼一篇帶圖的《由遍歷序列還原二叉樹結構》,理解難度並不高,同樣建議自己編碼實現一下。
六. 關於二叉樹
二叉樹是非常重要的資料結構,書中介紹的只是最基本的知識,更進一步的學習會涉及二叉樹的數學特性,限制更多效能也更優的平衡二叉樹,滿二叉樹,紅黑樹等等,以及相關的深度優先和廣度優先演算法,路還很長,靜下心慢慢走。