20172319 2018.10.19-10.26
《程序設計與數據結構》第6周學習總結
目錄
教材學習內容總結
第十章 樹
10.1 概述:html
- 樹(tree) 是一種非線性 結構,其元素被組織成了一個層次 結構。
- 樹 由一個包含結點 (node) 和邊(edge) 的集構成,其中的元素被存儲在這些結點中,邊則將一個結點和另外一個結點鏈接起來。
- 每一結點都位於該樹層次結構中的某一特定層上。
- 樹的根(root) :即位於該樹頂層 的惟一結點,一棵樹只有一個根結點。
- 位於樹中較低層的結點是上一層結點的孩子(children) , 同一雙親的兩個結點稱爲兄弟(sibling) 。
- 沒有任何孩子的結點稱爲葉子(leaf) , 一個至少有一個孩子的非根結點 稱爲一個內部結點(internal node) 。
- 若某一結點A從根 開始的路徑中位於另外一結點B之上,則稱A 爲B的祖先(ancestor) , 根是樹中全部結點的最終祖先。
- 沿着起始自某一特定結點的路徑能夠到達的結點是該結點的子孫(descendant) 。
![](http://static.javashuo.com/static/loading.gif)
- 結點的層 :從根結點 到該結點的路徑長度。經過計算從根到該結點所必須越過的邊數目,就能夠肯定其路徑長度(path length) 。
- 樹的高度(height) :指從根到葉子之間最遠路徑的長度。
![](http://static.javashuo.com/static/loading.gif)
- 10.1.1 樹的分類:
- 分類 方式有不少種:
- 最重要 的一條標準是樹中任一結點能夠具備的最大孩子數目。這一值有時候也稱爲該樹的度 (order) 。
- 廣義樹(general tree) : 對結點所含有的孩子數目無限制 的樹。
- n元樹(n-ary tree) : 每一結點所含孩子數目不超過n。
- 二叉樹(binary tree) : 結點最多具備兩個孩子。
- 另外一種分類方式:
- 判斷該樹是否平衡;粗略地說,若是樹的全部葉子都位於同一層或者至少是彼此相差不超過一層,就稱之爲是平衡的。
- 含有m個元素的平衡n元樹具備的高度爲lognm。 含有n個結點的平衡二叉樹具備的高度爲log2m。
- 徹底樹(complete tree) : 若是一棵樹是平衡的,且底層全部葉子都位於樹的左邊,則認爲該樹徹底。
- 徹底二叉樹在每一個k層上都具備2k個結點,最後一層除外,在最後一層的結點必須是最左邊結點。
![](http://static.javashuo.com/static/loading.gif)
滿樹(full tree) : n元樹的全部葉子都位於同一層且每一個結點只有一片葉子或正好具備n個孩子。
node
- 10.2 實現樹的策略
- 10.2.1 樹的數組實現之計算策略:
- 對於任何存儲在數組 位置n處的元素而言,該元素的左孩子 將存儲在位置(2 x n +1) 處 ,該元素的右孩子則存儲在位置(2 x (n + 1)) 處。
缺陷 : 浪費存儲空間;其會爲不徹底樹的無元素位置分配多餘的空間。
git
- 10.2.2 樹的數組實現之模擬連接策略:
- 數組的每個元素都是一個結點類,每一結點存儲的是每一孩子(可能還有其雙親)的數組索引,而不是做爲指向其孩子(可能還有其雙親)指針的對象引用變量。
- 元素能連續存儲在數組中,不會浪費存儲空間。
- 增長了刪除樹中元素的成本,要麼對剩餘元素進行移位以維持連續狀態,要麼保留一個空閒列表。
該策略容許連續分配數組位置而不用考慮該樹的完整性。算法
![](http://static.javashuo.com/static/loading.gif)
- 10.3 樹的遍歷
![](http://static.javashuo.com/static/loading.gif)
- 10.3.1 前序遍歷(preorder traversal):
- 從根結點開始,訪問每一結點及孩子。
![](http://static.javashuo.com/static/loading.gif)
- 10.3.2 中序遍歷(inorder traversal):
從根結點開始,訪問節點的左孩子,而後是該結點,再而後是剩餘任何結點。
數組
- 10.3.3 後序遍歷(postorder traversal):
從根結點開始,訪問結點的孩子,而後是該結點。
數據結構
- 10.3.4 層序遍歷(level-order traversal):
從根結點開始,訪問每一層的全部結點,一次一層。
post
- 10.4 二叉樹
- 二叉樹的操做:
-
getRoot |
返回指向二叉樹根的引用 |
isEmpty |
斷定該樹是否爲空 |
size |
斷定樹中的元素數目 |
contains |
斷定指定目標是否在樹中 |
find |
若是找到指定元素,則返回指向其引用 |
toString |
返回樹的字符串表示 |
iteratorInOrder |
爲樹的中序遍歷返回一個迭代器 |
iteratorPreOrder |
爲樹的前序遍歷返回一個迭代器 |
iteratorPostOrder |
爲樹的後序遍歷返回一個迭代器 |
iteratorLevelOrder |
爲樹的層序遍歷返回一個迭代器 |
返回目錄學習
教材學習中的問題和解決過程
返回目錄測試
代碼調試中的問題和解決過程
問題1:如何刪除某一指定結點的子樹。.net
- 解決:
剛開始的代碼是:
public LinkedBinaryTree removeRightsubtree(){
LinkedBinaryTree Rightsubtree = new LinkedBinaryTree();
Rightsubtree.root = root;
root.right = null;
return Rightsubtree;
}
- 定義一個新二叉樹,將原二叉樹複製,以後將二叉樹根右孩子賦予null,這樣右孩子與其後代即可所有刪除。
![](http://static.javashuo.com/static/loading.gif)
- 若是要刪除某一內部結點的子樹怎麼辦?
- 剛開始我寫的方法是這樣的:
public LinkedBinaryTree removeRightsubtree(BinaryTreeNode node){
LinkedBinaryTree Rightsubtree = new LinkedBinaryTree();
Rightsubtree.node = node;
node.right = null;
return Rightsubtree;
}
- 然而並不知道具體的元素結點的索引,所以決定換個參數:
public LinkedBinaryTree removeRightsubtree(T Element){
LinkedBinaryTree Rightsubtree = new LinkedBinaryTree();
BinaryTreeNode node = new BinaryTreeNode(Element);
Rightsubtree.node = node;
node.right = null;
return Rightsubtree;
}
- 仿造刪除根的子樹的方法,直接給索引結點賦null,然而,node只是我本身新創建的結點,賦值爲Element,並不是真正想刪除的樹的內部結點。
![](http://static.javashuo.com/static/loading.gif)
- 顯而易見,沒刪除掉;
- 以後發現首要解決的是找到對應Element元素的位置,然而頭鐵的我剛開始打算本身寫,寫了半天一大堆錯誤以後,才記起有個findNode方法:
![](http://static.javashuo.com/static/loading.gif)
- 前面同樣先將原樹複製,後面找到Element所在位置,而後對其子樹進行賦值null,便可刪除。
![](http://static.javashuo.com/static/loading.gif)
返回目錄
![](http://static.javashuo.com/static/loading.gif)
返回目錄
上週考試錯題總結
- 錯題1:上週無測試活動。
- 解決:
- 錯題2:
- 解決:
- 錯題3:
- 解決:
返回目錄
結對及互評
點評過的同窗博客和代碼
- 本週結對學習狀況:
- 20172316趙乾宸
- 博客中值得學習的或存在問題:
- 20172329王文彬
- 博客中值得學習的或存在問題:
- 博客內容充實、排版整齊、對教材內容有通過一番認真思考、繼續保持。
- 代碼截圖作標註時應儘可能避免遮擋代碼。
- Markdown的部分縮進有誤。
- 教材問題2提出得很好,能夠看出近斷時間來反覆使用鏈表、數組去實現同一類型的數據結構起得了必定的成效。
返回目錄
學習進度條
目標 |
3000行 |
15篇 |
300小時 |
第一週 |
0/0 |
1/1 |
12/12 |
第二週 |
935/935 |
1/2 |
24/36 |
第三週 |
849/1784 |
1/3 |
34/70 |
第四周 |
3600/5384 |
1/5 |
50/120 |
第五週 |
2254/7638 |
1/7 |
50/170 |
第六週 |
2809/10447 |
1/9 |
45/215 |
返回目錄
參考資料