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

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

教材學習內容總結

第11章 二叉查找樹

1、概述

  • 二叉查找樹是一種含有附加屬性的二叉樹,該屬性即其左孩子小於父節點,而父節點又小於等於其右孩子。以下圖所示。根結點的左子樹每一個元素都小於80,右子樹每一個元素都大於80.

  • 查找方法,要斷定一個具體的目標是否存在於樹中,須要沿着從根開始的路徑,根據查找目標是小於仍是大於當前結點的值,相應地轉到當前結點的左子結點或右結點。最終或是找到目標元素,或是遇到路徑的末端,後者意味着目標不在樹中。
  • 在二叉查找樹中添加元素,改過程相似於樹的查找過程,新元素添加爲樹的葉結點,從根開始,沿着每一個結點中元素所肯定的路徑,直到相應地方向上沒有子結點爲止,此時,將新元素添加爲葉結點。html

    若是沒有其餘操做,二叉查找樹的樹形由元素的添加順序來決定。java

  • 注:若是輸入是徹底有序的,二叉查找樹就會退化爲一個有序鏈表,削弱了它自己的價值,以下圖所示。git

  • 在二叉查找樹中刪除元素,要考慮以下三種狀況(參考下圖):

  • 第一種狀況:若是被刪除的結點是葉結點(無子結點),能夠簡單地刪除
  • 第二種狀況:若是被刪除的結點是隻有一個子結點,則用它的子結點替代它
  • 第三種狀況,若是被刪除結點有兩個子結點,在樹的更低層找到一個合適的結點來代替它。被刪除結點的子結點成爲替代結點的子結點。數據結構

    當從二叉查找樹中刪除有兩個子結點的結點是,比較好的辦法是用它的中序後繼來取代它,即在中序遍歷中排在被刪元素以後的那個元素(緊鄰的下一個值)性能

  • 二叉查找樹的接口類繼承自二叉樹的接口類BinaryTreeADT
public interface BinarySearchTreeADT<T> extends BinaryTreeADT<T>
{
    public void addElement(T element);
    //往樹中添加一個元素
    public T removeElement(T targetElement);
    // 從樹中刪除一個元素
    public void removeAllOccurrences(T targetElement);
    // 從樹中刪除所指定元素的任何存在
    public T removeMin();
    //刪除樹中最小元素
    public T removeMax();
    // 刪除樹中最大元素
    public T findMin();
    //返回一個指向樹中最小元素的引用
    public T findMax();
    //返回一個指向樹中最大元素的引用
}

2、平衡二叉查找樹

  • 在平衡二叉樹中進行查找,比在退化的樹中進行查找的效率高不少。在有n個結點的平衡樹中進行查找及添加操做的效率是進行O(log2 n)次比較(最長路徑的長度)。樹越退化,查找及添加操做的時間複雜度越接近O(n),它抵消了使用查找樹帶來的益處。學習

    能夠對二叉查找樹進行旋轉以恢復平衡測試

  • 右旋轉3d

1.令根的左子結點變爲新的根
 2.令原根結點變爲新的根結點的右子結點
 3.令原根的左子結點的右子結點變爲原根結點的新的左子結點
  • 左旋轉

1.令根的右子結點變爲新的根
 2.令原根結點變爲新的根結點的左子結點
 3.令原根的右子結點的左子結點變爲原根結點的新的右子結點

並不是全部的不平衡狀況均可以用一個單一的旋轉解決,若是不平衡性是由根的右子結點的左子樹的長路徑引起的,則必須先繞那個異常子樹執行一次右旋轉,而後再繞根執行一次左旋轉(右-左旋轉)。若是不平衡是由根的左子結點的右子樹中的長路徑引起,則執行(左-右旋轉)調試

3、AVL樹

  • AVL樹是最早發明的自平衡二叉查找樹。在AVL樹中任何節點的兩個子樹的高度最大差異爲一,因此它也被稱爲高度平衡樹。查找、插入和刪除在平均和最壞狀況下都是O(log n)。增長和刪除可能須要經過一次或屢次樹旋轉來從新平衡這個樹。

4、紅黑樹

  • 紅黑樹(RBT)是具備如下性質的二叉查找樹:
    • 1.節點非紅即黑。
    • 2.根節點是黑色。
    • 3.全部NULL結點稱爲葉子節點,且認爲顏色爲黑。
    • 4.全部紅節點的子節點都爲黑色。
    • 5.從任一節點到其葉子節點的全部路徑上都包含相同數目的黑節點。

顯然紅黑樹的平衡性能比AVL的略差些,可是通過大量試驗證實,實際上紅黑樹的效率仍是很不錯了,仍能達到O(logN)code

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

  • 問題1:紅黑樹這東西插入都要把顏色變來變去的,刪除怎麼辦啊
  • 解決方法:
    • 刪除結點的左右子結點均爲空,則將其直接刪除便可;
    • 刪除結點的左右子結點其中一方爲空,則將存在的那一方的子結點替代掉刪除結點便可。
    • 刪除結點的左右子結點均不爲空,首先選擇該結點的替代結點(能夠是其左子樹中的最大值,也能夠是其右子樹中的最小值,能夠確定的是替代結點必然最多隻有一個子結點),接着將替代結點替換掉刪除結點,同時把刪除結點刪掉,刪掉後的結果則分爲好幾種狀況(下面的結點爲替代替代結點後的結點):
    1. 結點爲新的根,此時只是將全部的路徑中都去除一個黑色結點,因此依然保持平衡;
    2. 結點的兄弟結點爲紅色;
    3. 結點的兄弟結點爲黑色,同時其子結點也均爲黑色;
    4. 結點的兄弟結點爲黑色,同時兄弟結點的左子結點爲紅色,右子結點爲黑色;
    5. 結點的兄弟結點爲黑色,同時兄弟結點的右子結點爲紅色,左子結點爲紅色;

      刪除操做中真正被刪除的一定是隻有一個紅色孩子或沒有孩子的結點。
      若是真正的刪除點是一個紅色結點,那麼它一定是一個葉子結點。

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

在完成pp11.3的時候,一切都很順利,可是在測試的時候報錯了,而後不斷追溯,發現是二叉查找樹繼承的以前的二叉樹的tostring方法有問題,這就很是難受了,又亂七八糟改了半天才能夠

代碼託管

上週考試錯題總結

沒有測試

結對及互評

  • 博客中值得學習的或問題:
    • 優勢:代碼編寫時遇到的問題記錄很是詳細;對書本上的內容理解也到位
    • 缺點:沒啥缺點,我以爲好的yipi。
  • 本週結對學習狀況

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積)
目標 5000行 30篇 400小時
第一週 0/0 1/1 8/8
第二週 671/671 1/2 17/25
第三週 345/1016 1/3 15/40
第四周 405/1421 2/5 23/63
第五週 1202/2623 1/5 20/83
第六週 1741/4364 1/6 20/103
第七週 400/4764 1/7 20/123

參考資料

相關文章
相關標籤/搜索