二叉樹-堆

  • 2019 年 12 月 31 日
  • 筆記

二叉樹:滿二叉樹、完全二叉樹

滿二叉樹:葉子節點都在最底層,除了葉子節點,其他節點都有左右兩個子節點;

完全二叉樹:葉子節點都在最底下兩層,最後一層的葉子節點都靠左排列,並且除了最後一層,其他層的節點個數都要達到最大;

  • 完全二叉樹
  • 堆的每個節點都大於等於(或者小於等於)其子樹的中的每個節點
  • 每個節點都大於等於其子樹的節點,叫大頂堆,即頂點為樹中最大值
  • 每個節點都小於等於其子樹的節點,叫小頂堆,即頂點為樹中最小值

堆的插入(最大堆)

  • 按照二叉樹的順序,插入新元素
  • 新插入的元素,需要與父節點比較,如果大於父節點,則和父節點交換
  • 依次與父節點比較,滿足則完成,否則繼續交換到根
  • 時間複雜度為 logN

堆的刪除(最大堆)

  • 刪除都是移除根元素,然後為了繼續滿足完全二叉樹的特性,需要將最後一個元素替換到根元素位置
  • 然後,從頂向下,做交換操作,直到滿足堆的特性,即父節點為子樹的最大值

Java的實現:PriorityQueue

# 父index 找 子index:  左子:2 * index + 1  右子:2 * index + 2  # 子index 找 父 index:  數學運算:(index-1) / 2  位運算:(index-1) >>> 2

插入

刪除

擴展

>>>與>>區別?  >>>為無符號右移  無論正負,高位都補0,  >>為右移  正數的話,高位補0  負數的話,高位補1    7 >>> 1  7 >> 1  -7 >>> 1  -7 >> 1