20172328 2018-2019《Java軟件結構與數據結構》第六週學習總結

20172328 2018-2019《Java軟件結構與數據結構》第六週學習總結

概述 Generalization

本週學習了第十章:非線性集合與數據結構--樹。主要討論了樹的使用和實現,以及考察實現和使用樹的實例。

教材學習內容總結 A summary of textbook

  • 樹(tree):樹是一種非線性結構,其元素被組織成了一個層次結構。下面是樹的術語,瞭解一下吧!
    • 樹有一個包含結點(node)邊(edge)的集構成,其中的元素被儲存在這些結點中,邊則將一個結點和另外一個結點鏈接起來。
    • 根(root):位於該樹頂層上的惟一結點。一棵樹只有一個根節點。
    • 孩子(children):位於樹中較低層的結點是上一層結點的孩子。
    • 兄弟(sibling):同一雙親的多個孩子互稱爲兄弟。其必定位於同一層級上。
    • 葉子(leaf):沒有任何孩子的結點稱爲孩子。
    • 內部結點(internal node):一個至少有一個孩子的非根節點稱爲一個內部結點。
    • 根是樹中全部結點的最終祖先(ancestor),沿着起始自某一特定結點的路徑能夠到達的結點是該結點的子孫(descendant)
    • 路徑長度(path length):結點的層也就是從根結點到該結點的路徑長度。
    • 高度(height):是指從根到葉子之間最遠路徑的長度。
  • 樹的分類: 對樹進行分類最重要的一條標準是按度(order)分類,另外一種方式是看該樹平衡與否
    • 度即爲樹中任一結點能夠具備的最大孩子數目。對結點所含有的孩子無限制的樹稱爲廣義樹,每一結點限制不超過n個孩子的樹稱爲n元樹,而進行二胎政策的也就是結點最多有兩個孩子的樹稱爲二叉樹
    • 對樹進行分類的另外一種方式是該樹平衡與否。若是樹的全部葉子都位於同一層或者至少是彼此相差不超過一個層,就稱之爲平衡的。
    • 徹底樹:若是某樹是平衡的,且底層全部葉子都位於樹的左邊,則認爲該樹是徹底的。
      • 徹底二叉樹是:在每一個k層上都具備2的k次方個結點,最後一層除外,在最後一層必須是最左邊結點。
    • 滿樹:若是一顆n元樹的全部葉子都位於同一層且每一結點要麼是一片葉子要麼正好具備n個孩子,則稱此樹是滿的。
  • 實現樹的策略:鏈式結構實現和數組實現。
  • 樹的數組實現之計算策略:一種可能的計算策略是將元素n的左孩子置於位置(2n+1),將右孩子置於位置(2(n+1))。
    • 缺點:若是咱們存儲的樹是不徹底的或者是相對徹底的,則該數組會爲不包含數據的樹位置分配空間,這就浪費了大量的存儲空間。
  • 樹的數組實現之模擬連接策略:模擬連接策略容許連續分配數組位置而不用考慮該樹的徹底性。
    • 缺點:這種方式雖然可以使得元素連續的存儲在空間中,不會浪費空間,但該方式增長了刪除樹中元素的成本,由於他要麼須要對剩餘元素進行移位來維持連續狀態,要麼須要保留一個空閒列表。
  • 對於樹的分析:對於任何含有m個元素的平衡n元樹,樹的高度都將是logn(m),有了二叉查找樹的排序性質後,就能夠保證在最壞的狀況下,查找一條從根到葉子的路徑,且該路徑不會長於logn(m)。
  • 遍歷樹的4種基礎方法
    • 前序遍歷(preorder traversal):從根結點開始,訪問每一節點及其孩子。按照上圖遍歷結果就是 A、B、D、E、C。
    • 中序遍歷(inorder traversal):從根結點開始,訪問結點的左孩子,而後是該結點,再而後是任何剩餘結點。按照上圖遍歷結果就是 D、B、E、A、C。
    • 後序遍歷(posterorder traversal):從根結點開始,訪問結點的孩子,而後是該結點。按照上圖遍歷結果就是 D、E、B、C、A。
    • 層序遍歷(level-order traversal):從根結點開始,訪問每一層的全部結點,一次一層。按照上圖遍歷結果就是 A、B、C、D、E。
  • 本章後面有關於幾種遍歷的代碼實現(如下是前序遍歷的實現和層序遍歷的實現):
public Iterator<T> iteratorPreOrder() 
    {
        ArrayUnorderedList<T> tempList = new ArrayUnorderedList<T>();
        preOrder(root, tempList);

        return new TreeIterator(tempList.iterator());
    }

    protected void preOrder(BinaryTreeNode<T> node,
                            ArrayUnorderedList<T> tempList) 
    {
        if (node != null)
        {
            tempList.addToRear(node.getElement());
            preOrder(node.getLeft(), tempList);
            preOrder(node.getRight(), tempList);
        }
    }
public Iterator<T> iteratorLevelOrder()
                {
                    ArrayUnorderedList<BinaryTreeNode<T>> nodes =
                            new ArrayUnorderedList<BinaryTreeNode<T>>();
                    ArrayUnorderedList<T> tempList = new ArrayUnorderedList<T>();
                    BinaryTreeNode<T> current;

                    nodes.addToRear(root);

                    while (!nodes.isEmpty())
                    {
                        current = nodes.removeFirst();

                        if (current != null)
                        {
                            tempList.addToRear(current.getElement());
                            if (current.getLeft() != null)
                    nodes.addToRear(current.getLeft());
                if (current.getRight() != null)
                    nodes.addToRear(current.getRight());
            }
            else
                tempList.addToRear(null);
        }
        
        return new TreeIterator(tempList.iterator());
    }
  • 二叉樹の使用:表達式樹:
  • 表達式樹就是使用二叉樹來計算後綴表達式,表達樹的根及其內部結點包含着操做,且全部葉子也包含着操做數,對錶達式的求值是從下往上的。鏈式結構實現優於數組結構實現,由於鏈式結構在將表達樹組合成一顆新樹時其複雜度爲O(1),而要把兩個數組歸併,在最佳狀況下其複雜度爲O(n)。
  • 用鏈表實現二叉樹
  • 具體內容看代碼實現
  • 二叉樹的性質:若二叉樹的根結點位於第一層html

    • 性質1:在二叉樹的第i層最多有2的i-1方個結點(i>=1)
    • 性質二:深度爲K的二叉樹最多有2的k次方-1個結點(K>=1)
    • 性質三:對任何一棵二叉樹,若是其葉結點個數爲n0,度爲2的結點數爲n2,則有:
      n0 = n2 + 1
  • 徹底二叉樹的性質:
    • 性質1:具備n個結點的徹底二叉樹的高度爲[log2(n)]+1 []表明取整
    • 性質2:若是將一棵有n個結點的徹底二叉樹自頂向下,同一層自左向右連續給結點編號1,2,3,···n,則對於任一結點i(1<i<=n),有:
      • 若i = 1,則該結點是樹根,他沒有雙親
      • 若2i > n,則編號爲i的結點無左孩子,不然他的左孩子是編號爲2i的結點
      • 若2i+1>n,則編號爲i的結點無右孩子,不然其右孩子節點編號爲2i+1;

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

  • 問題1:樹的數組實現中的模擬連接策略沒有看懂。?
  • 問題1的理解以及解決:經過老師上課的講解,我對這個問題有了本身的理解。當肯定好進入數組的順序後,經過先來先服務的基準連續分配數組位置,而不是經過其在樹中的定位將樹元素指派到數組位置上。數組的每個元素都是結點類,每個結點存儲的是該結點孩子的數組索引。
    java

  • 問題2:ExpressionTreeOp類中的int型變量termType=1的用處是什麼?當在ExpressionTree類中建立ExpressionTreeOp類的對象時沒有具體的方法參數,可是已經能夠判斷出運算符和操做數,因此不明白。
  • 問題2的理解以及解決:其實這個int型變量termType就是在程序中判斷操做符和操做數的一箇中間值,在PostfixEvaluator中也有體現.
if ((operator == '+') || (operator == '-') || (operator == '*') || 
                 (operator == '/'))
            {
                operand1 = getOperand(treeStack);
                operand2 = getOperand(treeStack);
treeStack.push(new ExpressionTree 
                                  (new ExpressionTreeOp(1,operator,0), operand2, operand1));
                                  }
else
            {
                treeStack.push(new ExpressionTree(new ExpressionTreeOp
                                    (2,' ',Integer.parseInt(tempToken)), null, null));
            }

代碼實現時的問題做答 Exercise

  • 問題1:不知道如何實現linkedBinaryTree中的toString方法,不知道如何輸出這棵樹.
  • 問題1的理解以及解決:首先想用迭代器接解決,可是層序遍歷調用的不是很正確,而且如何適當的把每一層分割開來,作出樹的樣子,這讓我很苦惱。其實暫時還沒解決。
  • 問題2:當時在寫hight時,理解錯誤了,當時寫的是while循環,一直在循環去找左子樹,而後只計算了層數(之前的代碼忘記截圖了)
  • 問題2的解決:可是hight是最遠路徑,通過我和仇夏同窗的討論,郭愷同窗、王文彬的提醒,咱們應該去遞歸找最遠的路徑,這樣來說咱們應該遞歸去找每一條線路,而後經過比較找到最長的路徑返回。
    node

  • 問題3:當時運行BackPainAnalyzer類時顯示文件找不到。git

  • 問題3的解決:經過結對小組的討論,加上路徑就解決了這個問題。

上週測試活動錯題改正 Correction

  • 1.The Java Collections API contains _________ implementations of an indexed list.
    A .Two
    B .Three
    C .Four
    D .Five
  • 問題1的解答:本題答案選C。可是緣由我找不到,由於列表能夠分爲有序列表、無序列表和索引列表可是JavaAPI中的索引列表有幾種實現方式我尚未找到相關資料。有一篇關於API文檔中List的解釋(https://www.cnblogs.com/cuglkb/p/7027907.html)可是仍是沒有講到這個問題,書本第120頁也只是籠統的說了這個概念,並無進行解釋
  • 問題2:An interface name can be used to declare an object reference variable. An interface reference can refer to any object of any class that implements the interface.
    A .True
    B .False
  • 問題2的解答:答案是A,接口名能夠用來聲明一個對象引用變量,一個接口引用能夠用來引用實現了該接口的任意類的任意對象。數組

    碼雲連接

代碼量(截圖)

結對及互評Group Estimate

點評模板:

  • 博客中值得學習的或問題:
    • 20172301:本次博客較爲樸素,我我的感受沒有上週的博客驚豔,原本就是新知識,也應該由淺入深的,因此個人博客質量也沒有太好,因此仍是慢慢來,繼續補充吧。
    • 20172304:本次博客很系統,本身還去實現了一下樹的輸出,我以爲本週的學習和博客很用心啦 w(゚Д゚)w
  • 本週結對學習內容:本週討論了樹的相關概念以及書上代碼的理解,對如何輸出一個樹進行了探討學習。數據結構

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

    非線性結構的學習開始是否是就意味着線性結構的學習先告一段落了呢,其實否則,在樹的到處透露着鏈表和數組的身影。想要融會貫通,還得繼續努力。post

    學習進度條Learning List

    代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積)
    目標 5000行 30篇 400小時
    第一週 0/0 1/1 8/8
    第二週 621/621 1/2 12/20
    第三週 678/1299 1/3 10/30
    第四周 2734/4033 1/4 20/50
    第五週 1100/5133 1/5 20/70
    第六週 1574/6707 2/7 15/85

參考資料Reference

相關文章
相關標籤/搜索