2、樹、二叉樹、二叉堆、優先隊列


一、樹的定義

  • 樹是 n(n≥0) 個節點的有限集,在任意一個非空樹中, 有如下特點:
    • 有且僅有一個 特定的節點稱爲根節點(root node
    • 其餘節點可分爲 m(m>0) 個互不相交的有限集, 每一個集合本身又是一個樹, 並稱爲根的子樹
  • 樹的最大層級數, 被稱爲樹的高度或深度,下圖中樹的高度爲 4
    在這裏插入圖片描述

二、二叉樹(Binary Tree)

  • 二叉樹的每個節點最多有 2 個孩子節點,注意:這裏是最多有 2 個,也可能只有 1 個, 或者沒有孩子節點
    在這裏插入圖片描述
  • 滿二叉樹:一個二叉樹的所有非葉子節點都存在左右孩子, 並且所有葉子節點都在同一層級上
    在這裏插入圖片描述
  • 完全二叉樹:跟滿二叉樹相比,其只需保證最後一個節點之前的節點都都存在左右孩子即可
    在這裏插入圖片描述
  • 二叉樹的存儲結構:二叉樹屬於邏輯結構, 它可以通過多種物理結構(eg:鏈表)來表達
    在這裏插入圖片描述
  • 二叉樹的應用:查找(類似二分查找算法,複雜度 O(logn), eg:二叉搜索樹)和維持相對順序(二叉排序樹)
  • 二叉樹的遍歷:
    • 深度優先遍歷,根據根節點的遍歷順序可分爲如下三種:
      • 前序遍歷:根左右(根節點、 左子樹、 右子樹)
      • 中序遍歷:左根右(左子樹、根節點、 右子樹)
      • 後序遍歷:左右根(左子樹、 右子樹、根節點)
    • 廣度優先遍歷(層序遍歷):從根節點到葉子節點的層次關係, 一層一層橫向遍歷各個節點(根左右)
      在這裏插入圖片描述
  • 用遞歸或棧來實現前序、 中序、 後序遍歷:
    • 這 3 種遍歷方式的區別, 僅僅是輸出的執行位置不同: 前序遍歷的輸出在前, 中序遍歷的輸出在中間, 後序遍歷的輸出在最後
    • 二叉樹的構建方法有很多, 這裏把一個線性的鏈表轉化成非線性的二叉樹, 鏈表節點的順序恰恰是二叉樹前序遍歷的順序。 鏈表中的空值, 代表二叉樹節點的左孩子或右孩子爲空的情況

三、二叉堆(Binary Heap)

  • 二叉堆是一種特殊的完全二叉樹, 分爲最大堆和最小堆,是實現堆排序及優先隊列的基礎:
    • 最大堆:任何一個父節點的值, 都大於或等於它左、 右孩子節點的值,堆頂(根節點)是整個堆中的最大元素
    • 最小堆:任何一個父節點的值, 都小於或等於它左、 右孩子節點的值,堆頂(根節點)是整個堆中的最小元素
  • 二叉堆的自我調整:
    • 插入節點:插入位置是完全二叉樹的最後一個位置,插入操作是單一節點的上浮,平均交換次數都是堆高度的一半, 所以時間複雜度是 O(logn)
    • 刪除節點:刪除的是處於堆頂的節點,刪除操作是單一節點的下沉,平均交換次數都是堆高度的一半, 所以時間複雜度是 O(logn)
    • 構建二叉堆:把一個無序的完全二叉樹調整爲二叉堆, 本質就是讓所有非葉子節點依次下沉,時間複雜度爲 O(n)

四、優先隊列(Priority Queue)

  • 優先隊列分爲最大優先隊列和最小優先隊列:
    • 最大優先隊列:無論入隊順序如何, 當前最大的元素都會優先出隊, 這是基於最大堆實現的,時間複雜度爲 O(logn)
    • 最小優先隊列:無論入隊順序如何, 當前最小的元素都會優先出隊, 這是基於最小堆實現的,時間複雜度爲 O(logn)
      在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章