20182330 第十週學習總結

20182330《程序設計與設計結構》 第十週學習總結

教材學習內容總結

週一: 樹

  1. 樹的定義:樹是有n個結點組成的有限集合
    n=0,爲空樹
    n》0,有特定節點爲根
  2. 特色:非線性結構:一個前驅多個後繼 。 其餘(除根)到根的路徑惟一
  3. 結點的度:結點的子樹數
    樹的度:結點的最大度數
    葉子:度爲0
    • 分支點:非終端結點
    • 結點的層次:根爲第一層
    • 樹的深度:結點的最大層次
    • 有序樹無序樹
    • 樹和森林
  4. 樹的基本操做
    • 查找插入刪除
    • traverse遍歷
  5. 存儲結構
  • 雙親表示法
define M 100
class PTNode{
ElemType data;
int parent}
class tree
{
PTN items[M]
int root;
int n;
  • 孩子表示法
    多重鏈表
    孩子鏈表(相似於鏈地址法)
  • 雙親孩子表示法
    結合1 2方法
  • 孩子兄弟表示法(左孩子右兄弟)

二叉樹

  1. 結點至多爲2,子樹有左右之分
  • 第i層最多有2^(i-1)個結點
  • 深度爲k最多有2^K-1個
  • 葉子比子節點多一n0=n2+1
  • 兩種特殊的二叉樹git

    滿二叉樹
    深度爲k: 2^k-1
    每層:2^i-1算法

徹底二叉樹:滿去掉最下層最右邊數組

二叉樹的遍歷(遞歸性)!!數據結構

  • 先序:先根後左右
  • 中序:先左後根再右
  • 後序:左右根
  • visit函數 前後沒法肯定

週三:遍歷

  1. 查詢二叉樹的某個結點
  2. 統計葉子結點個數
  3. 求二叉樹的深度:
    左右子樹最大值加一。後序遍歷
  4. 層序遍歷

週五:堆

  1. 徹底二叉樹:結點小於或等於左右孩子
    包含一樣數據的最小堆(小頂堆)不必定同樣
  2. 插入與重排序
    做爲葉子結點插入,且要保持數的徹底性
    插入位置:h層最右邊空位置(原來不滿);h+1層第一個位置
  3. 刪除
  • 刪除最小值,重構堆
  • 刪除root,把最後一個葉子移動到根再調整
  • 用順序存儲合適:更快定位索引
  • 根拿出來組成有序區,篩選調整,(無序區首尾交換)

教材學習中的問題和解決過程

  • 問題1:什麼叫樹的模擬連接策略?
  • 問題1解決方案:這種方式使得元素可以連續存儲在數組中而不用考慮該樹的徹底性。所以不會浪費空間,可是該方式增長了刪除樹中元素的成本。
  • 該數組的每一元素都是一個結點類,每一節點存儲的是每一孩子(可能還有其雙親)的數組索引,而不是做爲指向其孩子(可能還有其雙親)指針的對象引用變量。
  • 優勢:這種方式是的元素可以連續存儲在數組中,所以不會浪費空間。
  • 缺點:該方式增長了刪除樹中元素的成本,由於它要麼須要對生育元素進行移位以維持連續狀態,要麼須要保留一個空閒列表。
  • 通常而言,一棵含有m各元素的平衡n元樹具備的高度爲lognm。函數

  • 問題2:上課的時候沒有聽懂左旋和右旋?
  • 問題2解決方案:左旋右旋指的是AVL樹(高度平衡的搜索二叉樹
    一棵平衡樹,或是空樹,或是具備如下性質的二叉搜索樹:左子樹和右子樹都是AVL樹,且左右子樹的高度之差的絕對值不超過1。 )的平衡化旋轉。
    AVL樹相較於普通的二叉搜索樹,自主要的就是作了平衡化處理,使得二叉樹變的平衡,高度下降。
    在插入一個結點後應該沿搜索路徑將路徑上的結點平衡因子進行修改,當平衡因子大於1時,就須要進行平衡化處理。從發生不平衡的結點起,沿剛纔回溯的路徑取直接下兩層的結點,若是這三個結點在一條直線上,則採用單旋轉進行平衡化,若是這三個結點位於一條折線上,則採用雙旋轉進行平衡化。學習

左單旋

右單旋

雙旋轉

代碼調試中的問題和解決過程

  • 問題1:明白算法,可是不知道如何輸出一棵樹?有哪些輸出方法?
  • 問題1解決方案:
  1. 條形輸出:輸出的結果是[[[1] 3 [[4] 6 [7]]] 8 [10 [[13] 14]]](沒有樹型)
void puttree(tree t){

if(t==NULL)return;

else{

putchar(‘[‘);

puttree(t->left);

printf(「%d 」,t->data);

puttree(t->right);

putchar(‘]’);

}

}
  1. 躺着輸出(第一次看到這種輸出方法)
    能夠輸出一個樹形,可是須要歪着頭看
char bra[]={"-/\\<"};

void puttree(tree t,int h){

int i;

if(t!=NULL){

puttree(t->right,h+1);

for(i=0;i<h;i++)putchar('\t');

printf("%d",t->data);


putchar(bra[

((NULL!=(t->left))<<1)

|(NULL!=(t->right))

]);

putchar('\n');

puttree(t->left,h+1);

}

}
  1. 緩衝區輸出(沒有太理解,暫且不在這裏放代碼)
    本身定義字符緩衝區,先把樹形畫到緩衝區上,再把緩衝區的內容寫到屏幕。對於排序二叉樹,須要申請的字符緩衝區大小至少是高爲logn寬爲n。
  • 問題2:優先級隊列能不能像普通隊列那樣循環?
  • 他們的實現不一樣,普通隊列是用線性數據結構來實現的。優先隊列使用二叉堆來實現的,是非線性結構,保證了它的插入刪除時間複雜度都接近O(log2 n);實現不一樣,能作的功能也不一樣,優先級隊列也沒法實現循環遍歷。

代碼託管

上週考試錯題總結

上週無考試spa

結對及互評

點評過的同窗博客和代碼

  • 本週結對學習狀況
    • 20182314
    • 點評:知識點總結的較爲詳細,對二叉樹的理解很到位,排版簡潔,值得學習。
      基於評分標準,我給本博客打分:15分。得分狀況以下:
      感想,體會不假大空的加1分
      排版精美的加一分
      結對學習狀況真實可信的加1分
      正確使用Markdown語法
      模板中的要素齊全(加1分)
      錯題學習深刻的加1分
      點評認真,能指出博客和代碼中的問題的加1分
      教材學習中的問題和解決過程, 加5分
      代碼調試中的問題和解決過程,加2分
  • 上週博客互評狀況

其餘(感悟、思考等,可選)

堆的學習是在以前二叉樹的基礎上,其實優先級隊列就是將堆進行一次封裝,都調用了堆的函數。.net

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 42/42 2/2 20/20
第三週 394/471 2/4 25/45
第四周 394/471 2/4 25/45
第五週 1668/2139 2/6 35/80
第六週 2388/4527 1/7 30/110
第七週 1660 /6187 2/9 25/135
第八週 1660/7847 2/11 20/130
第九周 1660/9507 2/13 25/155
第十週 1144/10651 2/15 30/185
  • 計劃學習時間:25小時設計

  • 實際學習時間:30小時

  • 改進狀況:但願提升效率

參考資料

相關文章
相關標籤/搜索