本週學習了第11章:二叉查找樹。在本章中,主要探討了二叉查找樹的概念和各類二叉查找樹實現,考察爲二叉查找樹添加和刪除元素的算法以及維護平衡二叉查找樹的算法html
插入元素(addElement):java
(1)不容許插入相同關鍵字,若二叉查找樹中存在該關鍵字,則不插入node
(2)咱們能夠先檢索二叉樹,看查找樹中是否含有該關鍵字,若不存在,再作一次掃描將結點插入到適當位置。使用這種方式,爲插入一個該關鍵字,作了兩次掃描。git
(3)注意到,插入的結點老是做爲某一葉子節點的子結點,咱們能夠在第一次掃描過程當中就肯定待插入的位置,即把查找是否存在該關鍵字和查找可能的插入點在一次掃描中完成,提升插入效率。算法
刪除元素(removeElement):
在二叉查找樹中刪除一個給定的結點p有三種狀況:數組
(1)結點p無左右子樹,則直接刪除該結點數據結構
(2)結點p有左子樹(右子樹),則把p的左子樹(右子樹)接到p的父節點上學習
(3)左右子樹同時存在,找到結點p的中序直接後繼結點s,把結點s的數據轉移到結點p,而後刪除結點s,因爲結點s爲p的右子樹總最左的結點,於是s無左子樹,刪除結點s.測試
左右子樹的高度差爲二,旋轉有兩種::單旋轉,雙旋轉。不管單旋轉仍是雙旋轉,都知足先進行與深度較高的子樹同名(右子樹對右旋轉)旋轉,若是是雙旋轉則隨後進行異名(右子樹對左旋轉)旋轉大數據
實現二叉查找樹:紅黑樹
問題1:不明白書中removeElement方法中部分代碼的意思。書中解釋是:
若是被刪除結點有兩個孩子,則返回中序後繼者(由於相等元素會放到右邊)
代碼是
問題1的解決:刪掉冗餘代碼。
問題2: 實現add自我遞歸時出現的錯誤。首先是死遞歸,其次是出現了一行不明錯誤提醒。
問題2的解決:先是來解決不明錯誤提醒,我經過百度後得知:
原來Junit4中的測試方法的方法名首字母不能大寫!!!
經過修改代碼後,我發現是由於個人node直接定義成了root,因此在每次遞歸的時候又開始以前的路,就變成了死遞歸,在刪除代碼·node=root
後測試就出來了。可是因爲toString問題沒有解決,我用了中序遍歷,可是仍是出現了很使人傷心的結果,但經過找最大最小值,看的出來,個人插入方法已經成功將1插入了二叉查找樹。
問題3的解決:經過詢問郭愷同窗,借用了上週運算表達樹中PrintTree的輸出方法,稍做修改,就很完美的實現了樹形的正確輸出啦。
這道題我真的沒有找到圖,因此不知道她平不平衡。因此沒啥好說的······給出的答案是true。
20172304: 對於學習知識點掌握應該是挺好的,上課時對問題反應很迅速。本次博客教材學習中的問題和解決過程和代碼問題都寫的不是很詳細,望繼續改進。
今天早上的經濟學原理課程聽得我很快樂。範老師十分幽默風趣,講到了:在咱們面臨稀缺而選擇實現效益最大化時就要體現自身價值,在「萬類霜天競自由」的場景下是須要咱們去保持核心競爭力的。
上課時我進行了自個人反問。從前,我從不想將本身放在與人競爭的位置,只想儘可能作好本身。至少在我看來,同人相比較是件不光彩的事,每一個個體沒有相同的軌跡和須要被比較的必要。但如今想來,在生活的時時刻刻我又未嘗不是處在競爭的環境下呢?因此,作好本身並不去打擾別人的努力,自我奮鬥去實現自身價值便可。至於對待結果的態度,從一而終。
二叉查找樹這一章頗有意思也不太容易徹底理解。可是呢,事物的發展不是直線式前進的,而是螺旋式上升的。因此咱們既要看到道路的曲折,也要看到前途的光明!
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | |
---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 |
第一週 | 0/0 | 1/1 | 8/8 |
第二週 | 621/621 | 1/2 | 12/20 |
第三週 | 678/1299 | 1/3 | 10/30 |
第四周 | 2734/4033 | 1/4 | 20/50 |
第五週 | 1100/5133 | 1/5 | 20/70 |
第六週 | 1574/6707 | 2/7 | 15/85 |
第七週 | 1803/8510 | 1/8 | 20/105 |