20172303 2018-2019-1《程序設計與數據結構》第7周學習總結
阿新 • • 發佈:2018-11-03
備註 考試 roo strong findmi .get http 分享 可能
20172303 2018-2019-1《程序設計與數據結構》第7周學習總結
教材學習內容總結
本周在上周學習了二叉樹的基礎上,學習了一種二叉樹的特殊形式——二叉查找樹,又叫有序二叉樹、排序二叉樹。本章學習了兩種二叉查找樹的實現方法,以及兩種二叉查找樹的應用。
一、概述
1.二叉查找樹
- 概念:樹中的所有結點,其左孩子都小於父結點,父結點小於或等於其右孩子。
- 性質:
- 任意結點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
- 任意結點的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
- 任意結點的左、右子樹也分別為二叉查找樹;
- 沒有元素相等的結點。
2.二叉查找樹ADT
- 二叉查找樹的ADT是上一章中討論的二叉樹的擴展,其中的操作是二叉樹中已定義的那些操作的補充。
- 二叉查找樹中的操作:
addElement
:向樹中添加一個元素removeElement
:從樹中刪除一個元素removeAllOccurrences
:從樹中刪除所指定元素的任何存在removeMin
:刪除樹中的最小元素removeMax
:刪除樹中的最大元素findMin
:返回樹中的最小元素的引用findMax
:返回樹中的最大元素引用
二、二叉查找樹的實現
1.查找
- 二叉查找樹的查找方法與二分查找類似,將所要查找的元素與根結點的元素進行比較,如果小於根結點則繼續與左孩子對比,大於根結點則繼續與右孩子對比,如果相等則返回元素。實現方法有叠代和遞歸兩種。
- 叠代實現
public void find(T element) { T result = null; BinaryTreeNode node = root; while (node != null) { if (element.CompareTo(node.getElement) > 0) { node = node.right; } else if (element.CompareTo(node.getElement) < 0) { node = node.left; } else { result = node.getElement; break; } } return result; }
- 遞歸實現
public void find(T element) { return find(root, element); } private void find(BinaryTreeNode root, T element) { if (root == null) { return element; } int comparable = element.CompareTo(root.getElement); if (comparable > 0){ find(root.right,element); } else if (comparable < 0){ find(root.left,element); } else { return root.getElement; } }
2.插入
- 進行插入的操作有三種情況:
- 若當前的二叉查找樹為空,加入的元素會成為根結點。
- 若所插入結點的元素小於根結點的元素:
- 若根的左孩子為
null
,插入結點將會成為新的左孩子。 - 若根的左孩子不為
null
,則會繼續對左子樹進行遍歷,遍歷的同時進行比較操作。
- 若根的左孩子為
- 若所插入結點的元素大於或等於根結點的元素
- 若根的右孩子為
null
,插入結點將會成為新的右孩子。 - 若根的右孩子不為
null
,則會繼續對右子樹進行遍歷,遍歷的同時進行比較操作。
- 若根的右孩子為
3.刪除
- 二叉查找樹的刪除操作是所有操作中最為復雜的,我們先來考慮一種特殊情況:所刪除的元素是樹中的最大值或最小值。
(1)特殊情況:所刪除元素為樹中的最大值或最小值
- 由於二叉查找樹的特殊形式,其最小值一般位於樹的左子樹,最大值位於樹的右子樹。兩者的刪除方法是類似的,唯一不同的地方就是“左”和“右”,下面我們以刪除最大值為例來說明,刪除最小值的情況只要把例子中的“左”和“右”交換一下即可。
- 刪除最大值有三種情況:
- 情況一:若根結點沒有右孩子,那麽根結點的元素就為最大元素,原樹根的左孩子則會變成新的根結點。
- 情況二:若最大值的結點是一個葉子結點,那麽直接將其父結點的右孩子的引用設置為
null
即可。 - 情況三:若最大值的結點是一個中間結點,則需要設置其父結點的右孩子的引用為該結點的左孩子。
(2)正常情況
- 正常情況下刪除元素也有三種情況,但這三種情況就不是那麽簡單了。
- 情況一:
教材學習中的問題和解決過程
- 問題1:
- 問題1解決方案:
- 問題2:
- 問題2解決方法:
- 問題3:
- 問題3解決方法:
代碼調試中的問題和解決過程
- 問題1:
- 問題1解決方法:
- 問題2:
- 問題2解決方法:
代碼托管
上周考試錯題總結(正確為綠色,錯誤為紅色)
- 錯題1:The Java Collections API contains _________ implementations of an indexed list.
- A .Two
- B .Three
- C .Four
- D .Five
- 錯題1解決方法:我本來理解的是Java API中提供了幾種方法來實現列表,因此選擇兩種因為一種是
ArrayList
另一種是LinkedList
。後來發現是自己看錯題了沒有看到“索引”兩個字,原話在書上120頁。 - 錯題2:The elements of an unordered list are kept in whatever order the client chooses.
- A .True
- B .False
- 錯題2解決方法:當時做題的時候想的是無序列表的順序確實是由使用者來決定的啊,後來想想錯誤可能出在”whatever"上了。
結對及互評
點評模板:
- 博客中值得學習的或問題:
- 優點:本周的博客大有長進!內容豐富了很多,終於做到了圖文並茂,值得誇獎!
- 問題:圖片的排版還需加強。
- 代碼中值得學習的或問題:
- 優點:提了幾周的commit提交終於有所改進,感覺這周我的搭檔有了質的飛躍。
可能是一遍遍的吐槽起了作用,果然像馬原老師說的一樣,量變會引起質變! 問題:本周代碼的備註不是很多。
點評過的同學博客和代碼
- 優點:提了幾周的commit提交終於有所改進,感覺這周我的搭檔有了質的飛躍。
- 本周結對學習情況
- 20172322
- 結對學習內容
- 給我講解了課堂實驗ASL計算的方法。
- 主要探討了歸並排序的計數方法。
其他(感悟、思考等,可選)
- 因為跳啦啦操的緣故感覺最近的課程總是要落大家一些,現在啦啦操跳完了要趕緊追上大家ヾ(?°?°?)??
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一周 | 10/10 | 1/1 | 10/10 | |
第二周 | 246/366 | 2/3 | 20/30 | |
第三周 | 567/903 | 1/4 | 10/40 | |
第四周 | 2346/3294 | 2/6 | 20/60 | |
第五周 | 1343/4637 | 2/8 | 30/90 | |
第六周 | 1343/4637 | 2/8 | 30/90 | |
第七周 | 1343/4637 | 2/8 | 30/90 |
計劃學習時間:20小時
實際學習時間:30小時
改進情況:本周的大部分時間基本都花在了對於查找算法和排序算法的理解上了,感覺對時間復雜度理解和計算的應用變得更加熟練了。
參考資料
4 張 GIF 圖幫助你理解二叉查找樹
淺談算法和數據結構(7):二叉查找樹
20172303 2018-2019-1《程序設計與數據結構》第7周學習總結