20172310 2017-2018《程序設計與數據結構》(下)第六週學習總結

20172310 2017-2018《程序設計與數據結構》(下)第六週學習總結

教材學習內容總結

非線性集合與數據結構,樹的使用和實現。html

概述(樹的一些基本概念)

  • 樹(tree)是一種非線性結構,其中元素被組織成了一個層次結構。
  • 樹由一個包含結點(node)和邊(edge)的集構成。元素被存儲在這些結點中,邊將一個結點和另外一個結點鏈接起來。
  • 每一結點都位於該樹層次結構中的某一特定層上。樹的根(root)就是那個位於該樹頂層的惟一結點。
  • 位於樹中較低層的結點是上一層結點的孩子( children)。
  • 一個結點只有一個雙親,可是一個結點能夠有多個孩子。同一雙親的兩個結點稱爲兄弟( sibling)。根結點是樹中惟一一個沒有雙親的結點。沒有任何孩子的結點稱爲葉子(leaf)。一個至少有一個孩子的非根結點稱爲一個內部結點( internal node)。
  • 樹的類比是上下倒置的。
  • 根是樹結構的進入點。咱們能夠沿着一條經過該樹的路徑從雙親到達孩子。
  • 假如A在從根開始的路徑中位於另外一結點B之上,則A就是B 的祖先( ancestor)。根是樹中全部結點的最終祖先。沿着起始自某一特定結點的路徑能夠到達的結點是該結點的子孫( descendant)。
  • 結點的層也就是從根結點到該結點的路徑長度。經過計算從根到該結點所必須越過的邊數目,就能夠肯定其路徑長度( path length)。根是位於層0的。
  • 樹的高度( height)是指從根到葉子之間最遠路徑的長度。

樹的分類

  • n元樹:
    • 樹中任一結點能夠具備的最大孩子數目,這個值有時候也稱爲該樹的度( order)。對結點所含有的孩子數目無限制的樹稱爲廣義樹( general tree)。咱們將每一結點限制爲不超過n個孩子的樹稱爲一棵n元樹( n-ary tree)。
    • 結點最多具備兩個孩子的樹稱爲二叉樹( binary tree)。

      平均二叉樹的高度要比N小得多。分析代表,這個平均高度爲O(√N),而對於二叉查找樹(binary search tree),其高度的平均值是O(log N)。
  • 平衡樹:
    • 若是樹的全部葉子都位於同一層或者至少是彼此相差不超過一個層,就稱之爲是平衡的。
  • 徹底樹和滿樹:
    • 在樹是平衡樹的基礎上,底層全部葉子都位於樹的左邊,則認爲該樹是徹底的。若是一棵n元樹的全部葉子都位於同一層且每一個結點要麼是一片葉子要麼正好具備n個孩子,則稱此樹是滿的。

實現樹的策略

  • 樹的數組實現之計算策略
    :一種可能的計算策略是將元素n的左孩子置於位置(2×n+1),將右孩子置於位置(2×(n+1))(特別是對二叉樹的實現)
    但有些缺陷:若是咱們存儲的樹不是徹底的或只是相對徹底的,則該數組會爲不包含數據的樹位置分配空間,這就浪費了大量的存儲空間。
    java

  • 樹的數組實現之模擬連接策略
    :第二個可能策略模擬了操做系統管理內存的方式。容許連續分配數組位置而不用考慮該樹的徹底性,該數組的每一元素都是一個結點類,每一結點存儲的將是每一孩子(可能還有其雙親)的數組索引,而不是做爲指向其孩子(可能還有其雙親)指針的對象引用變量。
    缺陷:增長了刪除樹中元素的成本,由於它要麼須要對剩餘元素進行移位以維
    持連續狀態,要麼須要保留一個空閒列表。node

樹的遍歷

遍歷一棵樹有4種基本方法:




git

二叉樹

  • 二叉樹性質
    • 性質1:在二叉樹的第i層上至多有2^i-1個結點(i>=1)。
    • 性質2:深度爲k的二叉樹至多有2^k-1個結點(k>=1)。
    • 性質3:對任何一顆二叉樹T,若是其葉結點數爲n0,度爲2的 結點 數爲n2,則n0 = n2+1。
  • 兩種特殊的二叉樹(1)數組

    • 滿二叉樹( Full Binary Tree ) :每層都「充滿」告終點。深度爲k,結點總數2^k-1,每層結點數2^i-1
      數據結構

    • 徹底二叉樹( Complete Binary Tree ):樹中所含的n個結點和滿二叉樹中編號爲1至n的結點一一對應。(滿二叉樹去掉最下層最右邊若干結點)
      ide

  • 徹底二叉樹的性質
    • 性質1:具備n個結點的徹底二叉樹深度爲[log2n]+1 ([log2n]表示不 大於log2n的最大整數)。
    • 性質2:若是對一顆有n個結點的徹底二叉樹(其深度爲[log2n]+1) 的結點按層序編號(從第1層到第[log2n]+1層,每層從左到右),對任意一個結點i(1<=i<=n)有:
  • 對二叉樹的一些操做:
    學習

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

  • 問題1:樹的高度和深度的區別?老師上課時重複提到了這兩個概念,計算中很容易混淆這兩個概念,那這兩個概念究竟是什麼呢?
  • 問題1解決方案:lua

    高度的定義課本給出的是指從根到葉子之間最遠路徑的長度。還有的說法是從結點x向下到某個葉結點最長簡單路徑中邊的條數idea

就像是拿樓房來講,假如一我的提問:樓房的高度有多高?咱們會從底層開始往上數,假如樓有6層,則咱們會說,這個樓有6層樓那麼高。
課本上的例子A到F有四層,可是卻說他的高度爲3。

我在網上看了一些別的例子
人家給出的A到K的高度卻爲5。

因此我理解其實高度這個主要是因爲其根是1層仍是0層產生了不一樣,但不少時候按習慣來講通常都是以1開始。

深度是從根節點往下,深度是從根節點開始(其深度爲1)自頂向下逐層累加的。

總的來講對於整棵樹來講,最深的葉結點的深度就是樹的深度;樹根的高度就是樹的高度。這樣樹的高度和深度是相等的。
對於樹中相同深度的每一個結點來講,它們的高度不必定相同,這取決於每一個結點下面的葉結點的深度。

  • 問題2:書中代碼的理解
public int evaluateNode(BinaryTreeNode root)
    {
        int result, operand1, operand2;
        ExpressionTreeOp temp;

        if (root==null)
            result = 0;
        else
        {
            temp = (ExpressionTreeOp)root.getElement();

            if (temp.isOperator())//判斷temp是不是一個操做符,若是是一個操做數,進入循環,遞歸
            {
                operand1 = evaluateNode(root.getLeft());
                operand2 = evaluateNode(root.getRight());
                result = computeTerm(temp.getOperator(), operand1, operand2);
            }
            else//若是是操做符,則返回值
                result = temp.getValue();
        }

        return result;
    }
  • 問題2的解決方案:isOperator()方法是寫在ExpressionTreeOp類中
public boolean isOperator() 
    {
        return (termType == 1);
    }

相應的解釋就在代碼後加入了本身的理解。

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

  • 問題1:
    給出的信息是在循環出出現了錯誤,可是循環的代碼並沒用問題。就跟在打印二叉樹的表達樹時,也出現了錯誤

是最根本的LinkedBinaryTree.java文件中的方法發生了錯誤,因而進行了調試

發現GetRight和GetLeft的返回值是錯誤的,繼續發現原來是沒有編寫成功height()方法。

  • 問題1解決方案:因而就進行了以下的更改。

最後得出了正確的顯示

代碼託管

上週考試錯題總結

上週已總結。

結對及互評

點評:

  • 本週結對學習狀況
  • 博客和代碼中值得學習的或問題:
  • 教材中的問題總結的很詳細,第一個問題,由於課本上都是用的二叉樹爲例子,可是

    那麼當一個節點只有一個孩子的時候,此時沒有左右孩子之分。

我以爲就算沒有兩個或以上的孩子,但也能根據位置來肯定相對的左右。圖的畫法好像有點錯。此外,結果好像也有點問題,若是它不是左孩子,那麼會先訪問該節點,因此我認爲答案是D、H、B、E、A、F、C、G。

格式好像有點問題。

  • 對課本教材的代碼理解很好。

點評過的同窗博客和代碼

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

第十章內容真的是又多又難呀,樹是新接觸的概念,其中有不少的細小的知識和概念要去理解,在總結和記憶這些小知識點上花的時間仍是不少的。此外,這章的代碼其實很難理解,咱們上個學期學了迭代,但說句實話,內容都有些忘了,並且這章不只使用了迭代,並且代碼的邏輯,代碼爲何這樣寫都有些難以理解,書上的代碼有些都由於時間限制,就先囫圇吞棗了一番,以後才慢慢理解了。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積)
目標 5000行 30篇 400小時
第一週 0/0 1/1 10/10
第二週 326/326 1/2 18/28
第三週 784/1110 1/3 25/53
第四周 2529/3638 2/5 37/90
第五週 1254/4892 2/7 20/110
第六週 1403/6295 2/9 32/142
  • 計劃學習時間:30小時

  • 實際學習時間:32小時

  • 改進狀況:
    這周由於學習內容較多,因此時間也較長,但仍是要提升一下學習的效率。

參考資料

相關文章
相關標籤/搜索