20172303 2018-2019-1《程式設計與資料結構》第7周學習總結
阿新 • • 發佈:2018-11-02
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小時
改進情況:本週的大部分時間基本都花在了對於查詢演算法和排序演算法的理解上了,感覺對時間複雜度理解和計算的應用變得更加熟練了。