20172311《程式設計與資料結構》第七週學習總結
20172311《程式設計與資料結構》第七週學習總結
教材學習內容總結
第十一章 二叉查詢樹
- 樹是一種非線性結構,其中的元素被組織成一個層次結構
- 含有m個元素的平衡n元樹具有的高度為lognm
樹的陣列實現之計算策略:
如果我們儲存的樹不是完全的或者只是相對完全的,則該陣列會為不包含資料的樹位置分配空間
樹的陣列實現之模擬連結策略:
這種方式使得元素能夠連續儲存在陣列中,因此不會浪費空間,但是該方式增加了刪除樹中元素的成本。
樹的遍歷
1.先序遍歷
即根節點在左右子樹之前遍歷:
先訪問根節點
再先序遍歷左子樹
再先序遍歷右子樹
退出
2.中序遍歷
先中序遍歷左子樹
再訪問根節點
再中序遍歷右子樹
退出
3.後序遍歷
即根節點在左右子樹之後遍歷:
先後序遍歷左子樹
再後序遍歷右子樹
最後訪問根節點
退出
4.層序遍歷
即從根節點開始,訪問每一層的所有結點,一次一層
以上圖為例,三種遍歷結果:
先序遍歷:
1 2 4 5 7 3 6
中序遍歷:
4 2 7 5 1 3 6
後序遍歷:
4 7 5 2 6 3 1
層序遍歷:
1 2 3 4 5 6 7
二叉樹的ADT
二叉樹
二叉樹是有限個節點的集合,這個集合可以是空集,也可以是一個根節點和至多兩個子二叉樹組成的集合,其中一顆樹叫做根的左子樹,另一棵叫做根的右子樹。簡單地說,二叉樹是每個節點至多有兩個子樹的樹
完全二叉樹
完全二叉樹是一種特殊的二叉樹,滿足以下要求:
1.所有葉子節點都出現在 k 或者 k-1 層,而且從 1 到 k-1 層必須達到最大節點數;
2.第 k 層可是不是慢的,但是第 k 層的所有節點必須集中在最左邊。
簡單地說, 就是葉子節點都必須在最後一層或者倒數第二層,而且必須在左邊。任何一個節點都不能沒有左子樹卻有右子樹。滿二叉樹
如果一棵樹的高度為 k,且擁有 2^k-1 個節點,則稱之為 滿二叉樹。
就是說,每個節點要麼必須有兩棵子樹,要麼沒有子樹。滿二叉樹 和 完全二叉樹 的對比圖
教材學習中的問題和解決過程
- 問題:鏈式二叉樹中的
find
方法只能用在contain
方法裡,能不能返回一個BinaryTreeNode物件 ,便於往樹中新增新的元素 - 問題解決方案:
1.find
方法原始碼
public T find(T targetElement) { BinaryTreeNode<T> current = findNode(targetElement, root); if (current == null) throw new ElementNotFoundException("LinkedBinaryTree"); return (current.getElement()); }
返回BinaryTreeNode物件的find
方法程式碼
public BinaryTreeNode<T> findNode(T targetElement) {
BinaryTreeNode<T> current = findNode(targetElement, root);
if (current == null)
throw new ElementNotFoundException("LinkedBinaryTree");
return current;
}
2.經過對程式碼的深入理解發現這種方法並不可行,因為這樣新加入的元素並不能是一個單獨的LinkedBinaryTree(鏈式二叉樹)物件,只是一個BinaryTreeNode(二叉樹結點)物件,這樣會導致新插入的元素不能使用鏈式二叉樹類裡的方法。
程式碼除錯中的問題和解決過程
問題:背部診斷器類執行時一直報錯
- 問題解決方案:
經過單步除錯發現是因為我的LinkedBinaryTree類裡的getLeft
方法和getRight
方法返回的是BinaryTreeNode物件而不是LinkedBinaryTree物件,
對兩個方法進行修改後終於使問題得到解決
1.修改前的getLeft
方法和getRight
方法程式碼
//返回結點的左側子結點
public BinaryTreeNode<T> getLeft() {
return left.root;
}
//返回結點的右側子結點
public BinaryTreeNode<T> getRight() {
return right.root;
}
- 修改後的
getLeft
方法和getRight
方法程式碼
public LinkedBinaryTree<T> getLeft() {
return left.root;
}
//返回結點的右側子結點
public LinkedBinaryTree<T> getRight() {
return right.root;
}
程式碼託管
上週考試錯題總結
上週無錯題!!!
結對及互評
- 本週結對學習情況
本週主要對鏈式二叉樹進行了較為深入的學習,在學習的過程中遇到了諸多較難的問題,有的問題我們兩個也是都摸不著頭腦,但是通過查閱相關的資料最終使問題得到了解決!
感想
本週的主要學習內容是對樹的概念進行了較為深入的瞭解,並且對鏈式二茬表的實現進行了學習和實現,本章課本的例題程式碼比較複雜(對我來說很複雜了),在閱讀程式碼的過程中也是花費了不少時間,通過對本章的學習也是認識到了我的閱讀程式碼能力還是很差的!希望以後繼續努力,讓自己在這方面的能力有所提高吧!
學習進度條
程式碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 0/0 | 1/1 | 4/4 | |
第二週 | 464/464 | 1/2 | 10/14 | 理解掌握了用陣列和連結串列實現棧的方法 |
第三週 | 494/958 | 1/3 | 10/24 | 理解掌握了用陣列和連結串列實現佇列的方法 |
第四周 | 1629/2587 | 2/5 | 20/44 | 對用連結串列和陣列實現列表進行了學習 |
第五週 | 856/3443 | 2/7 | 15/59 | 較為深入的學習了查詢和排序方法的實現 |
第六週 | 668/4111 | 1/8 | 20/79 | 學習了鏈式二叉樹的實現 |
計劃學習時間:20小時
實際學習時間:20小時
改進情況:注重提高閱讀複雜程式碼的能力,努力提高解決程式碼bug的能力!!!