20172322 《程序設計與數據結構》第六週學習總結

20172322 《程序設計與數據結構》第六週學習總結

教材學習內容總結

本章的內容主要講樹,顧名思義樹與隊列、棧、列表最大的區別就在於,樹是一種非線性結構,其元素是一種層次結構存放。html

樹:java

  • 用於描述樹相關的術語有很是多,除了以前經常使用的結點(node)還有邊(edge)、孩子、兄弟等等,其中我認爲比較重要的有:
    • 內部節點:非根節點,且至少有一個子結點
    • 同胞節點:屬於同一節點的子結點
    • 葉節點:不包含任何子節點的結點
  • 樹的分類:能夠有很是多的分類方式,可是最重要的標準是任一結點能夠具備的最大孩子數目,成爲(order),n元樹的定義也是由此定義的
  • 樹的數組實現:由於數組實現樹比較麻煩,因此在樹的數組實現中書上一樣模擬了連接策略,如圖所示。

    node

  • 樹的遍歷,
    • 前序遍歷:從根節點開始訪問每個節點及其孩子。如圖:git

    • 中序遍歷:從根節點開始(注意並非先訪問根節點),中序遍歷根節點的左子樹,而後是訪問根節點,最後中序遍歷根節點的右子樹。如圖:數組

    • 後序遍歷:從左到右先葉子後節點的方式遍歷訪問左右子樹,最後訪問根節點。如圖:數據結構

    • 層序遍歷:從樹的第一層,也就是根節點開始訪問,從上到下逐層遍歷,在同一層中,按從左到右的順序結點逐個訪問。如圖:post

二叉樹

(二叉樹極其重要,以致於用三級標題來寫它,而不是通常的一個點。)二叉樹又名二元樹,它的每個結點最多具備兩個孩子結點。學習

  • 首先咱們來看看百度百科的對樹的定義:二叉樹是一個連通的無環圖,而且每個頂點的度不大於3。有根二叉樹還要知足根結點的度不大於2。有了根結點以後,每一個頂點定義了惟一的父結點,和最多2個子結點。然而,沒有足夠的信息來區分左結點和右結點。若是不考慮連通性,容許圖中有多個連通份量,這樣的結構叫作森林。
  • 與以前相似,本次教材也給出了二叉樹的ADTBinaryTreeADT其中的基本方法有:getRootisEmptysizecontainsfindtoString和一些迭代器相關的方法。
  • 書上提供了兩種二叉樹的例子:表達式樹和決策樹。
  • 關於二叉樹的一些性質,例如,
    • 在二叉樹的第i層最多有2i-1個節點
    • 深度爲k的二叉樹最多有2k-1個節點
    • 對於任何一個二叉樹,若是其葉結點個數爲n0,度爲2的結點數尾n2,則有:n0=n2+1
  • 關於徹底二叉樹的一些性質,例如,
    • 具備n個結點的徹底二叉樹的高度爲:log2n取下整數後+1
    • 若是將一個有n個結點的徹底二叉樹自頂向下,同一層自左向右連續給結點編號1,2,...,n,則對於任意結點i(1<=i<=n),有:
      • i=1,則該i結點是樹根,它無雙親;
      • 2i>n,則編號爲i的節點無左孩子,不然它的左孩子是編號爲2*i的結點;
      • 2i+1>n,則編號爲i的結點無右孩子,不然右孩子的編號爲2*i+1

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

  • 問題一:對於樹的遍歷問題,看了書之後感受不太明白,前序遍歷、中序遍歷、後序遍歷、層序遍歷這四個遍歷在書上的解釋不太清晰,看題之後也不太明白。
  • 問題一解決方案:在網上查詢了相關的內容,獲得了相應的解答。《二叉樹的四種遍歷方法筆記》。讓我豁然開朗。

暫時沒有遇到其餘的問題。測試

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

  • 問題一:在編寫PP10.5要求補全二叉樹的contains方法時,第一次本身的代碼以下
public boolean contains(T targetElement) {
        BinaryTreeNode current = root;
        BinaryTreeNode temp = root;
        boolean contains = false;
        if (current == null) {
            contains = false;
        }
        if (current.getElement().equals(targetElement)) {
            contains = true;
        }
        while (current.right != null)
        {
            if (current.right.getElement().equals(targetElement)) {
                contains = true;
            } else {
                current = current.right;
            }
        }
        while (temp.left != null)
        {
            if (temp.left.getElement().equals(targetElement))
            {
                contains = true;
            }
            else {
                temp = temp.left;
            }
        }
        return contains;
    }

這致使我測試該方法時只要是在判斷非根節點就會出現程序一直運行沒法中止的狀況。設計

  • 問題一解決方案:仔細回顧了本身的代碼,發現問題應該出如今while循環中,發現雖然我在代碼中寫到了若是查找/未找到到該元素就返回true/false而後返回該循環,沒有跳出操做,致使程序一直運行。因此說我分別改成了
if(current.right.getElement().equals(taretElement)) {
            contains = true;
            break;
        }

if (temp.left.getElement().equals(targetElement))
        {
            contains = true;
            break;
        }

後便解決了該問題。

代碼託管「點這裏跳轉到碼雲」

上週考試錯題總結

上週沒有測試,因此沒有錯題

結對及互評

  • 博客中值得學習的或問題:
    • 範雯琪同窗的博客課本上的學習內容總結部分寫得十分詳細,應該向她學習
  • 代碼中值得學習的或問題:
    • commit提交的解釋清晰明瞭,我以爲我應該學習。

點評過的同窗博客和代碼

其餘

  • 感悟:在以前學習的基礎上樹的實現已經變得簡單,只是迭代器和遞歸問題有些遺忘。

課本單詞

(本部分用於收集本章節後的生詞)

  • tree:樹
  • node:節點
  • edge:邊
  • root:根節點 最高層的節點
  • level:層
  • child:子節點
  • sibling:同胞節點
  • leaf:葉節點
  • internal node:內部結點
  • path:路徑
  • ancestor:祖先節點 位於當前節點以上的節點
  • descendant:後代節點
  • path length:路徑長度
  • tree height:樹高度
  • tree order:樹的階
  • general tree:通常樹 對子節點無限制的樹
  • n-ary tree:n元樹
  • binary tree:二叉樹
  • balanced:平衡 若是全部葉節點都位於同一層,或至少位於其餘某一層,就認爲是平衡樹
  • complete:徹底
  • full:完整
  • freelist
  • binary search tree:二叉查找樹
  • preorder traversal:前序遍歷
  • inorder traversal:中序遍歷
  • postorder traversal:後序遍歷
  • level-order traversal:層序遍歷

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/5000 2/2 8/8 認真學習!積極向上
第二週 812/812 1/3 22/30
第三週 814/1626 1/4 20/50
第四周 1386/3012 2/6 20/70 愉快的國慶節就要結束了...
第五週 1222/3234 1/7 30/100
第六週 1327/4561 2/7 30/100 啦啦啦啦啦
  • 計劃學習時間:30小時

  • 實際學習時間:30小時

  • 改進狀況:規範commit行爲。

參考資料

相關文章
相關標籤/搜索