二叉排序樹及相關操做說明

在講到集合的時候,很容易讓人想到的是數組和鏈表。而後你們會討論這兩種數據結構的差別。可是根據指定的內容在集合中查找,這兩種數據結構的性能卻沒有區別都是O(n),如何提升在集合中檢索指定內容數據的性能,是咱們在程序開發中面臨的問題。數組

二叉排序樹

二叉排序樹的性質

  1. 左子樹不空時,左子樹上全部的結點關鍵字的值均小於根結點關鍵字的值;
  2. 右子樹不空時,右子樹上全部的結點關鍵字的值均大於根結點關鍵字的值;
  3. 左右子樹同時有知足性質一、性質2

二叉樹的查找

  1. 將給定的值與根結點相比較,若相等則查找成功;
  2. 若小於根結點到左子樹進行查找,若大於根結點到右子樹進行查找;
  3. 左右子樹依次進行步驟一、步驟2操做,直到找到相等的結點或找到null(查找失敗)
  4. 二叉樹的查找與折半查找類似

二叉樹的操做

插入

例,根據{45,53,45,12,24,90}來構建二叉排序樹圖片描述數據結構

  1. 從一個空樹出發來構建二叉排序樹,新增結點是創建在查找二叉排序樹失敗的前提下,所以新增的結點必定是二叉排序樹的葉子結點
  2. 中序遍歷二叉排序樹便可獲得一個有序的集合

刪除

二叉排序樹的刪除規則:設,
*f爲指向被刪除結點的雙親結點的指針
*p爲指向被刪除結點的指針性能

  1. 若*p是葉子結點,那麼就直接刪除spa

    • *p是*f的左子結點,如圖所示:
      圖片描述
    • *p是*f的右子結點,如圖所示:
      圖片描述
  2. 若刪除的*p結點只有左子樹或是右子樹,刪除*p結點以後直接將子樹掛在*f結點上便可,成爲*f結點的子樹3d

    • *p是*f的左子結點,如圖所示:圖片描述
    • *p是*f的右子結點,如圖所示:圖片描述
    • 說明:上述只是部分狀況,剩餘狀況最後都跟上圖顯示的刪除*p結點以後的結點狀況一致。
  3. 若刪除的*p結點同時擁有左、右子樹,刪除節點有兩種可行性操做:指針

    • 若*p結點是*f的左子結點blog

      • 第一種操做:將*p點的左子樹PL直接掛載到*f結點上,成爲*f結點的左子樹,而後將*p結點的右子樹PR掛載到中序遍歷時PL子樹中*p結點的直接前驅節點,成爲該節點的右子樹;如圖所示:圖片描述
      • 第二種操做:使用二叉排序樹的中序遍歷獲得的結點順序,肯定*p結點的直接前驅或直接後繼結點,將該結點移到*p結點位置排序

        • 該結點知足如下特性:圖片

          1. 該結點是葉子結點或只有一個子樹(如果前驅節點只有左子樹;如果後繼節點只有右子樹)
          2. 該結點是*p前驅結點的話,就是該前驅結點父節點的右子結點;
          3. 該結點是*p後繼結點的話,就是該後繼結點父節點的左子結點。
        • 接下來以*p結點的前驅結點進行討論:開發

          • 若*p結點的前驅結點是葉子結點則直接移動便可,圖就略過了。
          • 若*p結點的前驅結點有左子樹的話,則將左子樹掛載到*p結點的前驅結點的父結點上,成爲*p結點的前驅結點的父結點的右子樹,如圖所示:圖片描述
        • 接下來以*p結點的後繼結點進行討論:

          • 若*p結點的後繼結點是葉子結點則直接移動便可,圖(略)
          • 若*p結點的後繼結點有右子樹的話,則將右子樹掛載到*p結點的後繼結點的父結點上,成爲*p結點的後繼結點的父結點的左子樹,如圖所示:圖片描述
        • 上述是在*p是*f的孩子的前提下進行的討論,接下來是以*p是*f的孩子進行討論,直接上圖了

          • 第一種操做:圖片描述
          • 第二種轉換:

            • 以*p結點的前驅結點進行討論
              圖片描述
            • 以*p結點的後繼結點進行討論圖片描述
相關文章
相關標籤/搜索