目錄
一、樹(Tree)的基本概念
- 節點最多爲兩個的樹叫做
二叉樹
, 節點多餘兩個的樹叫做多叉樹。
- 生活中的樹形結構
1、節點
- 節點:
1
、2
、3
、4
、5
、6
、21
、22
、31
、51
、52
、61
、221
、222
、223
- 根節點:
1
- 父節點:
1
是2
、3
、4
、5
、6
的父節點,2
是21
、22
的父節點,以此類推。 - 子節點:與父節點相反,2、3、4、5、6是1的子節點,21、22是2的子節點,以此類推。
- 兄弟節點:同一個父節點下的子節點互爲兄弟節點,例如上圖中的
21
和22
是兄弟節點,但是22
和31
雖然都在同一層,而父節點不同,所以不是兄弟節點。 - 空樹:一棵樹沒有任何節點,包括沒有根節點。
- 一棵樹可以只有一個節點,也就是根節點。
2、子樹
- 子樹:一棵樹可以有很多節點,而其中除了整體是一顆樹外,其中的子節點也可以單獨看成一棵樹,例如
2
、21
、22
、221
、222
、223
就是一顆子樹。 - 左子樹:左側的子節點稱爲
左子樹
,例如21是2的左子樹。 - 右子樹:右側的子節點稱爲
右子樹
,例如22是2的右子樹。
3、度
- 節點的度:
子樹的個數
,即子節點的個數,就是節點的度,例如根節點1
有5
個子節點,所以根節點1
的度是5
。 - 樹的度:所有節點度的
最大值
,上圖中節點度最大的是根節點
, 所以這棵樹的度是5
。 - 葉子節點:度爲
0
的節點,即沒有子節點的節點。 - 非葉子節點:度
不爲0
的節點,即有子節點的節點。
4、深度&高度
-
層數:根節點第一層,根節點的子節點在第`2``層,以此類推(有些教程是從第0層開始計算)。
-
節點的深度:從根節點到當前節點的唯一路徑上的節點總數。
- 節點2
的深度:1->2,經歷2個節點,所以深度爲
2`。 - 節點
223
的深度:1->2->22->223,經歷4個節點,所以深度是4
。
- 節點2
-
節點的高度:從
當前節點到最遠葉子節點
的路徑上的節點總數。- 節點2的高度:2->22->221,經歷
3
個節點,所以深度是3
- 節點223的深度: 223,只有一個節點,所以深度是
1
。
- 節點2的高度:2->22->221,經歷
-
樹的深度:所有節點
深度
的最大值
。- 1->2->22->221,所以樹的深度是
4
。
- 1->2->22->221,所以樹的深度是
-
樹的高度:所有節點
高度
的最大值
。- 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
。
- 假設度爲1 的節點個數爲n1,那麼二叉樹的總結點
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)
- n =
- 第i層的節點數量:
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爲向下取整
。