20182333 2019-2020-1 《數據結構與面向對象程序設計》第九周學習總結

20182333 2019-2020-1 《數據結構與面向對象程序設計》第九周學習總結

教材學習內容總結

第十六章 樹

  • 1.樹是非線性結構,其元素組織爲一個層次結構
    html

  • 2.樹的度表示樹中的任意結點的最大子結點數
  • 3.有m個元素的平衡n叉樹的高度是lognm
  • 4.樹的遍歷有4種方法
  • 5.進行層序遍歷時可採用隊列來儲存樹中的元素
  • 6.使用數組實現二叉樹時,位於位置n的元素的左孩子在(2n+1)的位置,其右孩子在(2*(n+1))的位置
  • 7.樹的基於數組的存儲鏈實現方式能夠佔數組中的連續位置,無論樹是否是徹底樹
  • 8.如何在通常二叉樹中添加及刪除元素,要取決於樹的用途
  • 9.使用決策樹能夠設計專家系統java

二叉樹

  • 1.二叉查找樹時一顆二叉樹,對於其中的每一個結點,左子樹上的元素小於父結點的值,二右子樹上的元素大於等於父結點的值
  • 2.若是沒有其餘的操做,二叉查找樹的樹形由元素的添加次序來決定
  • 3.最有效地二叉查找樹時平衡的,因此每次比較時能夠排除一半的元素
  • 4.當從二叉查找樹中刪除元素時要考慮三種情形,其中的兩種比較簡單
  • 5.當從二叉查找樹中刪除有兩個子結點的結點時,比較好的辦法是用它的中序後繼來取代它
  • 6.能夠對二叉查找樹進行旋轉以恢復平衡

部分計算公式

  • 1.二叉樹上第i層上的結點數目最多爲2^(i-1)(i>=1)
  • 2.深度爲k的二叉樹至多有2^k-1個結點(i>=1)
  • 3.包含n個結點的二叉樹的高度至少爲log2(n+1)
  • 4.在任意一棵二叉樹中,若終端結點的個數爲n0,度爲2的結點數爲n2,則n0=n2+1.

第十七章 二叉查找樹

二叉查找樹

在二叉查找樹中:git

若任意節點的左子樹不空,則左子樹上全部結點的值均小於它的根結點的值;

任意節點的右子樹不空,則右子樹上全部結點的值均大於它的根結點的值;

葉節點的左、右子樹也分別爲二叉查找樹。

沒有鍵值相等的節點。

插入刪除

與次優二叉樹相對,二叉排序樹是一種動態樹表。其特色是:樹的結構一般不是一次生成的,而是在查找過程當中,當樹中不存在關鍵字等於給定值的結點時再進行插入。新插入的結點必定是一個新添加的葉子結點,而且是查找不成功時查找路徑上訪問的最後一個結點的左孩子或右孩子結點。算法

  • 1.首先執行查找算法,找出被插結點的父親結點。數組

    判斷被插結點是其父親結點的左、右兒子。將被插結點做爲葉子結點插入。服務器

    若二叉樹爲空。則首先單獨生成根結點。首先執行查找算法,找出被插結點的父親結點。數據結構

    判斷被插結點是其父親結點的左、右兒子。將被插結點做爲葉子結點插入。學習

    若二叉樹爲空。則首先單獨生成根結點。測試

  • 2.執行刪除結點算法設計

    在二叉排序樹刪去一個結點,分三種狀況討論:

    1.若結點爲葉子結點,即左子樹和右子樹均爲空樹。因爲刪去葉子結點不破壞整棵樹的結構,則能夠直接刪除此子結點。

    2.若結點只有左子樹或右子樹,此時只要令或直接成爲其雙親結點的左子樹或右子樹便可,做此修改也不破壞二叉排序樹的特性。

    3.若結點的左子樹和右子樹均不空。在刪去結點以後,爲保持其它元素之間的相對位置不變,可按中序遍歷保持有序進行調整,能夠令結點的直接前驅(或直接後繼)替代該結點,而後再從二叉排序樹中刪去它的直接前驅(或直接後繼)即讓結點的左子樹(若是有的話)成爲結點左子樹的最左下結點(若是有的話),再讓左子樹成爲結點的左右結點的父結點。

平衡二叉查找樹

  • 1.平衡二叉查找樹是帶有平衡條件的二叉查找樹。
  • 2.平衡條件:每一個節點的左子樹和右子樹的高度差最多爲1二叉查找樹(其中空樹的高度爲-1)
  • 3.思想:向平衡二叉樹中插入一個新結點後破壞了平衡二叉樹的平衡性。首先要找出插入新結點後失去平衡的最小子樹根結點的指針。而後再調整這個子樹中有關結點之間的連接關係,使之成爲新的平衡子樹。當失去平衡的最小子樹被調整爲平衡子樹後,原有其餘全部不平衡子樹無需調整,整個二叉排序樹就又成爲一棵平衡二叉樹。
  • 4.右旋轉

    若是由根的左子結點的左子樹上的長路徑而帶來的不平衡性。將執行步驟:
      令根的左子結點變爲新的根。
      令原根結點變爲新的根結點的右子結點。
      令原根的左子結點的右子結點變爲原根的結點的新的左子結點。
  • 5.左旋轉

若是由根的右子結點的右子樹上的長路徑而帶來的不平衡性。將執行步驟:
   令根的右子結點變爲新的根。
   令原根結點變爲新的根結點的左子結點。
   令原根的右子結點的左子結點變爲原根的結點的新的右子結點。
  • 6.右-左旋轉

    若是不平衡性是由根的右子結點的左子樹中的長路徑引起的,則必須先繞那個異常子樹執行一次右旋轉,而後再繞跟執行一次左旋轉。
  • 7.左-右旋轉

    若是不平衡性是由根的左子結點的右子樹中的長路徑引起的,則必須先繞那個異常子樹執行一次左旋轉,而後再繞跟執行一次右旋轉。

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

  • 問題1:樹的遍歷
  • 問題1解決方案:

    一、先序遍歷——先訪問根,再自左向右遍歷子樹

    二、中序遍歷——遍歷左子樹,而後訪問根,而後自左向右遍歷餘下的各個子樹

    三、後續遍歷——自左向右遍歷各個子樹,而後訪問根

    四、層序遍歷——從樹的頂層(根)打包底層,從左至右,訪問樹中每層的每一個結點

  • 問題2:滿二叉樹和徹底二叉樹的區別
  • 問題2解決方案:

    滿二叉樹——除了葉結點外每個結點都有左右子葉且葉子結點都處在最底層的二叉樹。

    徹底二叉樹——若設二叉樹的高度爲h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第h層有葉子結點,而且葉子結點都是從左到右依次排布,這就是徹底二叉樹。

    滿二叉樹必定是徹底二叉樹,徹底二叉樹不必定是滿二叉樹。

  • 問題3:二叉查找樹如何添加元素?
  • 問題3解決方案:首先咱們須要瞭解二叉樹中元素是如何放置的。咱們定義一個根的元素,而後把新加進來的元素和根比較(以第二個加進來的元素爲10,根爲20舉例)。10<20,因此咱們將10放在根的左結點,因爲根的左子樹目前只有一個元素因此咱們將10設置爲根的左子樹的根。若是第三個元素是11,那麼咱們首先和根比較,小於20,那麼咱們將11往下放,與10比較,比10大,那麼咱們放在10的右結點上。(若是添加的元素比20小也比10小那麼放在10的左結點)以此類推。右子樹也是同樣的道理。總的來講,二叉樹的元素放置是以根爲基準,比根大的放右子樹,比根小的放左子樹。若是同樣的話左右子樹任君挑選。

  • 問題4:爲何二叉查找樹的平衡性很是重要?
  • 問題4解決方案:若是二叉查找樹是平衡的,每次比較時都會排除差很少一半的元素。樹越不平衡,它離線性結構越近,效率也就越低。

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

  • 問題1:在對方法進行測試時,發現使用toString時會出現空指針的狀況
  • 問題1解決方法:我仔細閱讀了報錯給的提示,發現最終是個人ArrayList中的find方法存在毛病,由於所比較的數據類型爲T,因此在判斷兩個元素是否相等的時候不能使用「equals」,更改爲「==」問題就得解決掉了。

代碼託管

上週考試錯題總結

  • 1.

  • 解析:對隊列的操做沒有記清,這道題全部的操做都是隊列的操做。

  • 2.

  • 解析:若是在空堆棧上調用pop方法,則拋出EmptyCollectionException。

  • 3.

  • 解析:自引用對象是指引用同一類型的另外一個對象。
  • 單詞:self-referential(自引用對象)

  • 4.

  • 解析:概念混餚,節點的平衡因子=右子樹的高度-左子樹的高度。
  • 單詞:subtree minus(子樹)
  • 5.

  • 解析:樹或樹的任何子樹只有兩種方式會變得不平衡:經過插入節點或刪除節點。
  • 單詞:insertion (插入)

點評過的同窗博客和代碼

  • 本週結對學習狀況
    • 20182317
    • 20182318
    • 結對學習內容
      • 樹的四種遍歷
      • 前、中、後綴表達式
      • 關於二叉樹的一些計算
      • 二叉查找樹
  • 上週博客互評狀況

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

本週主要學習了樹和二叉查找樹。學到了許多重要的知識,例如四種遍歷、三種表達式、關於樹的問題的一些計算、二叉查找樹的平衡因子等等,收穫頗多。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 10000行 30篇 400小時
第一週 56/56 2/2 20/20 主要學會了簡單的操做Linux以及如何編寫簡單的java程序並將它上傳到碼雲
第2、三週 331/407 3/5 23/43 學會了一些類和程序包的使用,也明白了C語言和Java在有些地方的區別
第四周 595/1002 2/7 20/60 學會了IDEA以及用IDEAgit碼雲,也學會了TDD測試
第五週 1621/2623 2/9 17/77 見識了服務器與用戶連接的代碼,也學習了繼承的一些知識。
第六週 1770/4393 1/10 22/99 學習了多態以及與接口和繼承的關係,還有就是對異常的學習和處理異常的方法以及自定義一個異常
第七週 1747/6140 3/13 23/122 學習了漸進複雜度的計算,棧和隊列的學習,分別用數組和鏈表實現隊列
第八週 384/6524 1/14 20/142 學習了一些查找和排序的算法,也學會了計算ASL
第九周 1895/8419 3/17 22/164 學習了樹的四種遍歷,和怎樣根據已知序列求未知序列等等
  • 計劃學習時間:20小時

  • 實際學習時間:22小時

  • 改進狀況:無

參考資料

相關文章
相關標籤/搜索