樹的數組實現之計算策略:html
若是咱們存儲的樹不是徹底的或者只是相對徹底的,則該數組會爲不包含數據的樹位置分配空間
git
樹的數組實現之模擬連接策略:數組
這種方式使得元素可以連續存儲在數組中,所以不會浪費空間,可是該方式增長了刪除樹中元素的成本。
數據結構
樹的遍歷
1.先序遍歷
即根節點在左右子樹以前遍歷:
先訪問根節點
再先序遍歷左子樹
再先序遍歷右子樹
退出
2.中序遍歷
先中序遍歷左子樹
再訪問根節點
再中序遍歷右子樹
退出
3.後序遍歷
即根節點在左右子樹以後遍歷:
前後序遍歷左子樹
再後序遍歷右子樹
最後訪問根節點
退出
4.層序遍歷
即從根節點開始,訪問每一層的全部結點,一次一層
學習
以上圖爲例,三種遍歷結果:.net
先序遍歷:
1 2 4 5 7 3 6設計
中序遍歷:
4 2 7 5 1 3 6調試
後序遍歷:
4 7 5 2 6 3 1code
層序遍歷:
1 2 3 4 5 6 7htm
二叉樹的ADT
二叉樹
二叉樹是有限個節點的集合,這個集合能夠是空集,也能夠是一個根節點和至多兩個子二叉樹組成的集合,其中一顆樹叫作根的左子樹,另外一棵叫作根的右子樹。簡單地說,二叉樹是每一個節點至多有兩個子樹的樹
徹底二叉樹
徹底二叉樹是一種特殊的二叉樹,知足如下要求:
1.全部葉子節點都出如今 k 或者 k-1 層,並且從 1 到 k-1 層必須達到最大節點數;
2.第 k 層但是不是慢的,可是第 k 層的全部節點必須集中在最左邊。
簡單地說, 就是葉子節點都必須在最後一層或者倒數第二層,並且必須在左邊。任何一個節點都不能沒有左子樹卻有右子樹。
滿二叉樹
若是一棵樹的高度爲 k,且擁有 2^k-1 個節點,則稱之爲 滿二叉樹。
就是說,每一個節點要麼必須有兩棵子樹,要麼沒有子樹。
滿二叉樹 和 徹底二叉樹 的對比圖
find
方法只能用在contain
方法裏,能不能返回一個BinaryTreeNode對象 ,便於往樹中添加新的元素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(二叉樹結點)對象,這樣會致使新插入的元素不能使用鏈式二叉樹類裏的方法。
問題:背部診斷器類運行時一直報錯
getLeft
方法和getRight
方法返回的是BinaryTreeNode對象而不是LinkedBinaryTree對象,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的能力!!!