20172322 《程序設計與數據結構》第七週學習總結
教材學習內容總結
本章的內容主要講二叉查找樹,二叉查找樹是對於二叉樹的一種拓展,這意味着上一章中對於二叉樹的操做對於二叉查找樹一樣適用,同時它也是一種帶有附加屬性的二叉樹。這種附加屬性即:對樹中的每一個結點,它的左孩子都要小於其父結點,而父結點又小於或等於它的右孩子。這意味着在全部比根結點大的元素都存在於根結點的左邊,而比根結點小的元素都在根結點的右邊。如圖所示:html
值得一提的是,對二叉查找樹進行中序遍歷,正好能夠獲得一隊遞增排序的元素。java
例如,對於以前所示二叉查找樹進行中序遍歷能夠等到:1,3,4,6,7,8,10,13,14。git
- 二叉查找樹的查找算法:由於二叉查找樹的每一個結點都具備特殊性質,因此說全部的元素都是以必定的順序存在於二叉查找樹中,因此對於比根結點大的元素就去根結點的左子樹查找,對於比根結點小的元素就去根結點的右子樹查找,這個算法若是使用遞歸實現會很是方便。
例如,查找10算法
1.查看根節點9:
數據結構
2.因爲10 > 9,所以查看右孩子13:
性能
3.因爲10 < 13,所以查看左孩子11:
學習
4.因爲10 < 11,所以查看左孩子10,發現10正是要查找的節點:
設計
- 二叉查找樹的插入算法:由於二叉查找樹是一個其結點具備特定屬性的二叉樹因此它的插入算法就只須要一個方法,我以爲二叉查找樹與有序列表相似,僅需一個
addElement
方法就能夠把一個元素插入正確的位置。具體的解決方案是:
- 首先執行查找算法,找出被插結點的父親結點。
- 判斷被插結點是其父親結點的左、右兒子。將被插結點做爲葉子結點插入。
- 若二叉樹爲空。則首先單獨生成根結點。
- 二叉查找樹的刪除算法:刪除結點有三種狀況分別是須要刪除的結點是葉結點,是僅有左子樹/右子樹的結點,是既有左子樹又有右子樹的結點。
- 刪除的結點是葉結點,直接讓樹結點的父結點的下一個指向
null
便可。
- 刪除的結點是僅有左子樹/右子樹的結點,將該節點刪除後,將該結點的左結點/右結點提到被刪除結點的位置便可。
- 刪除的結點是既有左子樹又有右子樹的結點,這個時候須要用到中序遍歷後的前驅結點,將前驅結點提到被刪除結點的位置。
平衡二叉查找樹,它存在的意義在於提高效率,例如,一棵蛻化樹看起來更像一個鏈表可是它的效率比鏈表還差。3d
如圖所示,調試
- 對於一個平衡二叉查找樹來講,它的查找效率會比第二種蛻化樹高不少,由於在蛻化樹中的每一個結點附帶有額外的開銷,因此說咱們就要想着將一些樹儘量的改變爲平衡二叉查找樹。將一個費平衡二叉查找樹改變成爲二叉查找樹主要有四種方法:右旋,左旋,左右旋,右左旋。
在提到四種方法以前,有一個概念須要理解,一個平衡二叉查找樹的最大路徑長度應該爲log2n(n爲元素個數),而且最長路徑必須不小於log2n-1(n爲元素個數),若是一個樹的最長查找路徑大於log2n則代表它不平衡,這時候就須要必定的操做使其平衡。
右旋,一般是指左孩子繞着其父結點向右旋轉,通常適用於左子樹長於右子樹的狀況
左旋,一般是指右孩子繞着其父結點向左旋轉,通常適用於右子樹長於左子樹的狀況
AVL樹,在以前的基礎上添加了平衡因子的說法,即左右子樹的高度差,若是高度差大於1或者小於-1,則以該結點爲樹根的子樹須要從新平衡。
- 紅黑樹,顧名思義,即給每一個結點賦以紅和黑兩種顏色,對於紅黑樹的三點規定以下,
- 根結點爲黑色。
- 紅色節點的孩子爲黑色。
- 從樹根到樹葉的每條路徑都包含一樣樹木的黑色結點。
- 紅黑樹的插入,老是把插入的新元素的顏色設爲紅色,在插入事後極大可能會致使一系列操做以再次平衡紅黑樹。
紅黑樹的刪除,與插入相似,刪除一個元素後有極大可能須要一系列操做以再次平衡紅黑樹。
教材學習中的問題和解決過程
- 問題一:對於紅黑樹存在的意義問題,爲何要單獨設置一個紅黑樹呢?紅黑樹能夠解決的問題AVL樹也一樣能夠解決。
- 問題一解決方案:這個問題我在網上查找了部分答案,發現爲何須要發明紅黑樹。
- 最主要就是效率問題,紅黑樹並不追求「徹底平衡」——它只要求部分地達到平衡要求,下降了對旋轉的要求,從而提升了性能。
- 固然這也不是沒有代價的,紅黑樹是犧牲了嚴格的高度平衡的優越條件爲代價讓紅黑樹可以以O(log2 n)的時間複雜度進行搜索、插入、刪除操做。
代碼調試中的問題和解決過程
- 問題一:對於AVL樹的實現存在一些問題,本來覺得書上所給的代碼已經實現了AVL樹,就好像那個
addElement(T element)
同樣。
- 問題一解決:詢問告終對夥伴,發現好像不是這樣的,
addElement(T element)
這個方法只能一直添加元素,但不能使得元素成爲平衡樹,就好像若是一直利用這個方法添加遞減的元素會致使蛻化樹的出現。
- 問題二:對於AVL樹的實現有一些疑惑,它的左旋、右旋、左右旋、右左旋怎麼實現?
- 問題二解決:班主任在藍墨雲上的資源《紅黑樹(五)之 Java的實現》的博主對於樹的實現有一系列的東西,不僅是紅黑樹,我在其博客中找到了《AVL樹(三)之 Java的實現》,借鑑了博主的部分代碼,而且看懂了他們,感謝博主
上週考試錯題總結
結對及互評
- 博客中值得學習的或問題:
- 範雯琪同窗對於遞歸和迭代的問題讓我想到了不少,也瞭解了遞歸與迭代的區別。
- 代碼中值得學習的或問題:
- commit提交的解釋清晰明瞭。
- 不懂就問,頗有求知精神
點評過的同窗博客和代碼
- 本週結對學習狀況
20172303
- 結對學習內容
- 咱們一塊兒實現了本週須要實現的一些PP項目而且給互相講述了其中的基本原理。
其餘
- 感悟:感受本身在代碼上的問題愈來愈少了...快要找不出問題了,怎麼辦...必定是我學得還不夠認真
課本單詞
(本部分用於收集本章節後的生詞)
- binary search tree:二叉查找樹
- degenerate tree:蛻化樹
- right rotation:右旋
- left rotation:左旋
- rightleft rotation:右左旋
- leftright rotation:左右旋
- AVL tree:AVL樹
- balance factor:平衡因子
- red/black tree:紅黑樹
學習進度條
目標 |
5000行 |
30篇 |
400小時 |
|
第一週 |
0/5000 |
2/2 |
8/8 |
認真學習!積極向上 |
第二週 |
812/812 |
1/3 |
22/30 |
|
第三週 |
814/1626 |
1/4 |
20/50 |
|
第四周 |
1386/3012 |
2/6 |
20/70 |
愉快的國慶節就要結束了... |
第五週 |
1222/3234 |
1/7 |
30/100 |
|
第六週 |
1327/4561 |
2/7 |
30/100 |
啦啦啦啦啦 |
第七週 |
1170/5631 |
1/8 |
33/133 |
|
計劃學習時間:25小時
實際學習時間:33小時
改進狀況:規範commit行爲,改進博客園模版。
參考資料