二叉樹

二叉樹是一種樹形結(jié)構(gòu),二叉樹可以是空樹(沒有任何節(jié)點(diǎn))或有一個(gè)根結(jié)點(diǎn)下面帶有零個(gè)、一個(gè)或兩個(gè)子樹。每個(gè)節(jié)點(diǎn)下最多有只有左右兩個(gè)子節(jié)點(diǎn),分別稱之為左子節(jié)點(diǎn)和右子節(jié)點(diǎn)。
二叉樹有一個(gè)比較重要的特點(diǎn)是,它的子樹摘下來,都是一個(gè)二叉樹,因此二叉樹的任何一個(gè)子樹都可以看作是一顆二叉樹。二叉樹的節(jié)點(diǎn)可以包含數(shù)據(jù)和指向左右子節(jié)點(diǎn)的指針。

下面是一個(gè)簡單的二叉樹圖:
keep(深度) 簡稱K
Tree(樹) 簡稱T
        1             ---K = 1   
      /   \                 
     2     3          ---K = 2   
    / \   / \               
   4   5 6   7        ---K = 3

在這個(gè)二叉樹中,根結(jié)點(diǎn)是1,它的左子節(jié)點(diǎn)是2,右子節(jié)點(diǎn)是3。在2和3下,又對應(yīng)有左子節(jié)點(diǎn)4、5和6、7,他們節(jié)點(diǎn)最多只有2個(gè),因此稱為二叉樹。

名次解釋
  1. 根:二叉樹就像一個(gè)倒過來的樹,樹只有一個(gè)跟,二叉樹也是一樣的。上圖可以看出二叉樹的根是1。
  2. 分支節(jié)點(diǎn):樹是有枝干的,枝干上長滿了樹葉,二叉樹也是一樣的,如果節(jié)點(diǎn)上(除了根)有子節(jié)點(diǎn)的話,我們稱之為分支節(jié)點(diǎn)。不難看出,上圖中分支節(jié)點(diǎn)分別為2、3。
  3. 葉子結(jié)點(diǎn):當(dāng)二叉樹的節(jié)點(diǎn)下沒有子節(jié)點(diǎn),我們稱之為葉子節(jié)點(diǎn)。葉子結(jié)點(diǎn)分別是4、5、6、7。
  4. 邊:邊我們理解就是上圖的連線,上圖總共有6條線,為6個(gè)邊。
  5. 度:每個(gè)節(jié)點(diǎn)單獨(dú)拎出來我們都可以稱之為樹,我們看每個(gè)樹下有多少個(gè)子樹稱之為度,如上圖,2、3有兩個(gè)子樹,所以度為2,葉子節(jié)點(diǎn)4、5、6、7沒有子樹,所以葉子節(jié)點(diǎn)度為0。
公式
  1. 任意二叉樹,他們第N層最大的節(jié)點(diǎn)數(shù)公式是:2K-1(K>=1),上圖深度為3層,所以最大節(jié)點(diǎn)數(shù)是在第三層,套入公式23-1 = 4,所以上圖為例,最大節(jié)點(diǎn)數(shù)為4。

  2. 任意二叉樹,他們最大的節(jié)點(diǎn)數(shù)公式是:2k-1(K>=1),上圖深度為3層,所以最多的節(jié)點(diǎn)套入公式23-1 = 7,所以上圖為例,最多的節(jié)點(diǎn)數(shù)是7。

  3. 樹的總節(jié)點(diǎn)數(shù)=所有節(jié)點(diǎn)的度數(shù)+1。

  4. 度為0的結(jié)點(diǎn)(即葉子結(jié)點(diǎn))總是比度為2的結(jié)點(diǎn)多一個(gè)。

  5. 具有n個(gè)結(jié)點(diǎn)的二叉樹,其深度至少為[log2n]+1,其中[log2n]+1表示取log2n的整數(shù)部分。

  6. 具有n個(gè)結(jié)點(diǎn)的完全二叉樹的深度為[log2n]+1。

二叉樹基本形態(tài)總共分為5種,分別是空樹、只有一個(gè)根節(jié)點(diǎn)的二叉樹、只有左子樹、只有右子樹和完全二叉樹。
1. 空樹
空樹

空樹,顧名思義就是啥也沒有,一個(gè)節(jié)點(diǎn)也沒有

2. 二叉樹只有一根節(jié)點(diǎn)
只有一個(gè)根節(jié)點(diǎn)

只有一個(gè)根節(jié)點(diǎn),下面不再有任何子節(jié)點(diǎn)

3. 只有左子樹
只有左子樹

一個(gè)根節(jié)點(diǎn)下面所有的子節(jié)點(diǎn)只有一個(gè)度,并且子節(jié)點(diǎn)只在左邊。

4. 只有右子樹
只有右子樹

一個(gè)根節(jié)點(diǎn)下面所有的子節(jié)點(diǎn)只有一個(gè)度,并且子節(jié)點(diǎn)只在右邊。

5. 左右子樹都非空
左右子樹都非空

所有節(jié)點(diǎn)都有兩個(gè)度,每個(gè)節(jié)點(diǎn)下都掛滿左右子節(jié)點(diǎn)

二叉樹還有另外三種特殊形態(tài),分別為斜二叉樹、完全二叉樹和滿二叉樹。
1. 斜二叉樹
斜二叉樹

如圖所示,所有節(jié)點(diǎn)都倒向了同一邊,我們稱之為斜二叉樹。

2. 完全二叉樹
完全二叉樹

在樹的左邊有N層連續(xù),右邊到最右邊為N-1層,我們稱之為完全二叉樹。

3. 滿二叉樹
滿二叉樹

所有節(jié)點(diǎn)都有兩個(gè)度,每個(gè)節(jié)點(diǎn)下都掛滿左右子節(jié)點(diǎn)

二叉樹的遍歷
1. 前序遍歷:遵循根左右的原則,以次訪問根節(jié)點(diǎn)、左節(jié)點(diǎn)、右節(jié)點(diǎn)。

訪問順序?yàn)椋篈 B D H I E J C F K G


前序遍歷
2. 中序遍歷:遵循左根右的原則,以次訪問左節(jié)點(diǎn)、根節(jié)點(diǎn)、右節(jié)點(diǎn)。

訪問順序?yàn)椋篐 D I B E J A F K C G


中序遍歷
3. 后序遍歷:遵循左右根的原則,以次訪問左節(jié)點(diǎn)、右節(jié)點(diǎn)、根節(jié)點(diǎn)。

訪問順序?yàn)椋篐 I D J E B K F G C A


后序遍歷
二叉樹的增刪改查
添加

當(dāng)添加節(jié)點(diǎn)是,只需要遵循左小右大的原則往下追加即可。

查找
二叉樹查找

當(dāng)我們要查找4的時(shí)候,步驟如下

  1. 先從根結(jié)點(diǎn)開始判斷 4 < 10 ,尋找左子樹。
  2. 4 < 5,繼續(xù)尋找左子樹。
  3. 4 > 3,尋找到右子樹,直到找到為止。
修改

使用查找到對應(yīng)的子樹需要修改修改的節(jié)點(diǎn),改變節(jié)點(diǎn)的值就可以了。

刪除

刪除分三種情況
1.刪除的是葉子節(jié)點(diǎn),那么直接刪除即可。


刪除葉子節(jié)點(diǎn)

2.刪除的節(jié)點(diǎn)只有左(右)子樹,需要把子左(右)子樹繼承皆可。


刪除只有左(右)子樹節(jié)點(diǎn)

2.刪除的節(jié)點(diǎn)有左和右子樹,需要把左子樹最大值或者右子樹最小值繼承過來。(這個(gè)我們選的是左子樹的最大值)
刪除的節(jié)點(diǎn)有左和右子樹
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容