《戀上數據結構與算法》筆記(七):二叉樹

目錄


一、樹(Tree)的基本概念

跳轉到目錄

  • 節點最多爲兩個的樹叫做二叉樹, 節點多餘兩個的樹叫做多叉樹。
    在這裏插入圖片描述
  • 生活中的樹形結構
    在這裏插入圖片描述

1、節點

跳轉到目錄
在這裏插入圖片描述

  • 節點123456212231515261221222223
  • 根節點1
  • 父節點123456的父節點,22122的父節點,以此類推。
  • 子節點:與父節點相反,2、3、4、5、6是1的子節點,21、22是2的子節點,以此類推。
  • 兄弟節點:同一個父節點下的子節點互爲兄弟節點,例如上圖中的2122是兄弟節點,但是2231雖然都在同一層,而父節點不同,所以不是兄弟節點。
  • 空樹:一棵樹沒有任何節點,包括沒有根節點。
  • 一棵樹可以只有一個節點,也就是根節點。

2、子樹

跳轉到目錄

  • 子樹:一棵樹可以有很多節點,而其中除了整體是一顆樹外,其中的子節點也可以單獨看成一棵樹,例如22122221222223就是一顆子樹。
  • 左子樹:左側的子節點稱爲左子樹,例如21是2的左子樹。
  • 右子樹:右側的子節點稱爲右子樹,例如22是2的右子樹。

3、度

跳轉到目錄

  • 節點的度:子樹的個數,即子節點的個數,就是節點的度,例如根節點15個子節點,所以根節點1的度是5
  • 樹的度:所有節點度的最大值,上圖中節點度最大的是根節點, 所以這棵樹的度是5
  • 葉子節點:度爲0的節點,即沒有子節點的節點。
  • 非葉子節點:度不爲0的節點,即有子節點的節點。

4、深度&高度

跳轉到目錄

  • 層數:根節點第一層,根節點的子節點在第`2``層,以此類推(有些教程是從第0層開始計算)。

  • 節點的深度:從根節點到當前節點的唯一路徑上的節點總數。

    • 節點2的深度:1->2,經歷2個節點,所以深度爲2`。
    • 節點223的深度:1->2->22->223,經歷4個節點,所以深度是4
  • 節點的高度:從當前節點到最遠葉子節點的路徑上的節點總數。

    • 節點2的高度:2->22->221,經歷3個節點,所以深度是3
    • 節點223的深度: 223,只有一個節點,所以深度是1
  • 樹的深度:所有節點深度最大值

    • 1->2->22->221,所以樹的深度是4
  • 樹的高度:所有節點高度最大值

    • 1->2->22->221,所以樹的高度是4。

5、樹的分類

跳轉到目錄

  • 有序樹:樹種任意節點的子節點之間有順序關係,即兩個樹所有的值都一樣,但是其中的子節點順序不一樣,就是兩顆不同的有序樹
  • 無序樹:樹中任意節點的子節點之間沒有順序關係,也稱爲自由樹
  • 森林:由m(m >= 0)顆互不相交的樹組成的集合

二、二叉樹

跳轉到目錄

1、二叉樹的性質

跳轉到目錄

  • 每個節點的最大爲2,即最多擁有2顆子樹

  • 左子樹和右子樹是有順序的,比如所有節點左子樹小於右子樹。

  • 即使某節點只有一顆子樹,也要區分左右子樹
    在這裏插入圖片描述

  • 非空二叉樹的第i層,最多有2^(i-1)個節點(i >= 1)。

  • 高度爲h的二叉樹最多有2^h - 1個節點(h >= 1)。

  • 對於任意一顆非空二叉樹,如果葉子節點個數爲n0,度爲2的節點個數爲n2,則有:n0 = n2 + 1

    • 假設度爲1 的節點個數爲n1,那麼二叉樹的總結點n = n0 + n1 + n2
      二叉樹的邊數T = n1 + 2 * n2,這是因爲n1的每個節點下有1個子節點,所以邊是n1,n2的每一個節點都有2個子節點所以是n2 * 2。反過來看,因爲所有的節點上面都有一條邊,只有根節點上沒有邊。所以,二叉樹的邊數T = n1 + 2 * n2 = n - 1 = n0 + n1 + n2 - 1。即: n1 + 2 * n2 = n0 + n1 + n2 - 1 可以推出n0 = n2 + 1
      在這裏插入圖片描述

2、二叉樹的種類

跳轉到目錄

a、真二叉樹

跳轉到目錄

  • 所有節點的度要麼爲0,要麼爲2,即沒有隻有一個子節點的節點。
    在這裏插入圖片描述
b、滿二叉樹

跳轉到目錄

  • 所有節點的度要麼爲0,要麼爲2。且所有的葉子節點都在最後一層。
  • 在同樣高度的二叉樹中,滿二叉樹的葉子節點數量最多,總結點數量最多。
  • 滿二叉樹一定是真二叉樹,真二叉樹不一定是滿二叉樹。
    在這裏插入圖片描述
  • 假設滿二叉樹的高度爲h(h >= 1),那麼:
    • 第i層的節點數量:2^(i - 1)
    • 葉子節點數量:2^h - 1
    • 總結點數量 n
      • n = 2^h - 1 = 2^0 + 2^1 + 2^2 + 2^3 +...+ h^(h - 1)
      • h = log2(n + 1)
c、完全二叉樹

跳轉到目錄

  • 葉子節點只會出現最後2層,最後1層的葉子節點都靠左對齊(只能缺少右子樹)。

  • 完全二叉樹從根節點至倒數第2層是一顆滿二叉樹。

  • 滿二叉樹一定是完全二叉樹,完全二叉樹不一定是滿二叉樹。
    在這裏插入圖片描述

  • 度爲1的節點只有左子樹。

  • 度爲1的節點要麼是1個,要麼是0個。

  • 同樣節點數量的二叉樹,完全二叉樹的高度最小。

  • 假設完全二叉樹的高度爲h(h >= 1),那麼:

    • 至少有2^(h - 1)個節點(2^0 + 2^1 + 2^2 + … + 2^(h - 2) + 1)。

    • 最多有2^h - 1個節點(2^0 + 2^1 + 2^2 + … + 2^(h - 1), 滿二叉樹)。

    • 總節點數量爲 n:

      • 2^(h - 1) <= n < 2^h
      • h - 1 <= log2(n) < h
      • h = floor(log2n) + 1
  • 一個有n個節點的完整二叉樹(n > 0),從上到下,從左到右對節點從1開始編號,對任意第i個節點:

    • 如果i = 1,它是根節點。
    • 如果i > 1,它的父節點編號爲floor(i/2)。
    • 如果2i <= n,它的左子節點編號爲2i。
    • 如果2i > n,它無左子點。
    • 如果2i + 1 <= n,他的右子節點編號爲2i + 1。
    • 如果2i + 1 > n,它無右子節點。
  • 一個有n個節點的完整二叉樹(n > 0), 從上到下,從左到右對節點從0開始編號, 對任意第i個節點:

    • 如果i = 0,它是根節點。
    • 如果i > 0,它的父節點編號爲floor((i- 1)/2)。
    • 如果2i + 1 <= n - 1,它的左子節點編號爲2i + 1。
    • 如果2i + 1 > n - 1,它無左子點。
    • 如果2i + 2 <= n - 1,他的右子節點編號爲2i + 2。
    • 如果2i + 2 > n - 1,它無右子節點。

三、leetcode算法題

跳轉到目錄

1、尋找完全二叉樹的葉子節點

在這裏插入圖片描述

  • 總節點數量爲n
  • n如果是偶數,葉子節點數量n0 = n / 2
  • n如果是奇數,葉子節點數量n0 = (n + 1) / 2
  • 可以一併寫成:n0 = floor((n + 1) / 2)
  • floor爲向下取整
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章