資結筆記|二元樹(Binary Tree)

更新於 發佈於 閱讀時間約 5 分鐘

基本觀念


  二元樹(Binary Tree)是一種樹狀的資料結構,每個節點可以儲存3筆資料,包含數據本身(data)、左指標(left)、右指標(right)。見下圖

raw-image

  在樹狀結構中最上方的是根節點(root node),每個節點最多可以有兩個子節點,這兩個子節點可以用左指標和右指標連結,如果一個節點沒有子節點稱為葉節點(leaves node),見下圖

raw-image

  所謂的子節點是指從同一個節點延伸出來的節點,以上圖為例,點7和點10是從點9延伸出來的,那我們就會稱點7和點10為點9的子節點,而點9為它們的父節點,點7和點10互為兄弟節點。


建立二元樹


建立二元樹需遵守以下兩個規則

  1. 先建立根節點
  2. 接著插入的新數據,如果數據比目前的節點大,則向右邊節點送,若比目前小則向左邊節點送,直到送到的位置沒有子節點則建立該節點

接著只要不斷重複規則2即可完成二元樹的建立,見下圖

假設我們要建立的數據為12、8、9、3、10、4

(1)建立根節點

raw-image

(2)8<12,向左

raw-image

(3)9<12,向左;9>8,向右

raw-image

(4)10<12,向左;10>8,向右;10>9,向右

raw-image

(5)4<12,向左;4<8,向左;4>3,向右

raw-image

以上這顆二元樹就建立完成


刪除二元樹節點

二元樹刪除節點會遇到以下三種情況


一、刪除的是葉節點

這種情況因為沒有子節點,所以直接刪除即可。


二、所刪除的節點有1個子節點

這種情況也很單純,將欲刪除的節點刪除,並將它原本的子節點移動到它的位置取代它,就完成了。


三、所刪除的節點有2個子節點

有2種方法可以使用我們用下面這張圖舉例


raw-image

方法一:從左子樹找最大節點


  以上圖為例,假設我們要刪除的是節點8,8的左子樹里最大的是節點4,將4移動到原先8的位置就可以了,另外如果節點4下面也有子節點,則重複執行刪除節點的步驟就可以了。


方法二:從右子樹找最小節點


  一樣以上圖為例,假設我們要刪除的是節點8,從節點8的右子樹中,最小的是節點9,我們將節點9取代節點8的位置就完成了,一樣如果要移上去的節點下也有子節點,則重複執行刪除節點的步驟。


搜尋二元樹的數據


  搜尋二元樹節點的方式跟插入有點像,從根節點開始和要找的節點比大小,目標節點如果比較大,就向右子節點走,如果較小,就向左子節點走。見圖


raw-image


raw-image


raw-image

假設到最後沒有找到相同的子節點,則代表這個數據不存在。


二元樹的階層(level)與深度(depth)

通常根節點稱為第一層然後向下延伸,見下圖


raw-image

  而深度則是該子節點與根節點的最短距離,depth = level - 1,以上圖舉例,節點5的階層是第4層,深度為3。另外,在二元樹中每 i 層最多有 

2^n 個節點,其中 n= i - 1


二元樹的分類


一、滿二元樹(full binary tree)


  滿二元樹是指除了葉節點沒有子節點外,其餘每個節點皆有2個子節點,見下圖


raw-image

二、完全二元樹(complete binary tree)


  完全二元樹是指除了最深層外,每個節點都是滿的,最深一層可以從左到右連續有節點,不可以中斷,見下圖。

raw-image
raw-image
raw-image

上面的這三棵樹都符合,下面的是不符合的

raw-image

這樣有理解完全二元樹的概念嗎~至於為什麼會存在這種分類就與資料儲存有關


三、完美二元樹(perfect binary tree)


完美二元樹是指除了最深層的節點外,所有子節點都是滿的,見下圖

raw-image

四、平衡二元樹(balanced binary tree)


  平衡二元樹是指,每兩個節點的子節點深度相差小於等於1,見下圖

raw-image

  以這顆二元樹為例,以節點12為基準,左子樹深度3右子樹深度2,相差1

raw-image

  接著我們以節點9為基準,左子樹深度1,右子樹深度2,相差1,你可以檢查每一個節點,下方連結到的左右子樹的深度相差小於等於1,這棵樹就是平衡二元樹。接著我們舉一個不合格的例子

raw-image

  以節點12為基準,左子樹深度3,右子樹深度1,左右子樹相差2,不符合平衡二元樹的標準。


二元樹的列印方式


一、中序(inorder)列印


所謂的中序列印分為以下3個步驟

(1)從左子樹往下走,直到無法前進就處理此節點

(2)接著處理此節點的父節點

(3)接著往右子樹走,若右子樹無法前進則回到上一層

以這張圖為例

raw-image

  大家可以跟著數字走,數字變為紅色則列印出這個數字你會得到以下數列 9 10 12 14 17 19 剛好是由小排到大,另外中序列印因為處理的順序是左子樹(left, L)根節點(root, D)右子樹(right, R)所以簡稱為LDR


二、前序(preorder)列印


前序列印是走到哪就列印到哪,遍歷的順序是往左子樹走直到無法前進,接著往右走,以這張圖為例

raw-image

  因為走到哪就處理到哪所以蠻簡單的,使用前序列印出來的結果是 12 9 10 17 14 19 而又因為處理的順序是先根節點、左子樹、右子樹,所以縮寫為DLR


三、後序(postorder)列印


  後序列印跟前序不同在於,根節點留到最後處理,先處理左子樹,在處理右子樹,當這個節點的兩個子節點處理完成後,再處理該節點,見下圖

raw-image

  使用後序列印出來的結果是 10 9 14 19 17 12 因為處理的順序是先左子樹、右子樹、根節點,所以縮寫為LRD


二元樹的時間複雜度

raw-image

以上大概介紹完二元樹的概念了(累,因為這個主題有點龐大所以實作的部分留待後續在補,另外平衡二元樹在增減節點時,會遇到需要旋轉以維持樹的平衡,也請留待筆者後續補充。










留言
avatar-img
留言分享你的想法!
avatar-img
資治通艦的沙龍
3會員
45內容數
人生中有的時候你會感知到,現在就是那個命運的分歧點,如果我不挽起袖子努力的話,我這一輩子大概就這樣了,所以我決定開始這個部落格,記錄我每天的努力,也希望可以分享學習的筆記與心得,大家可以一起交流學習。
資治通艦的沙龍的其他內容
2025/04/08
請使用 C 或 Java 語言寫一副程式,此副程式對一個長度為 10 的整數陣列 A[0:9],最多花費 15 次的數值比較運算,尋找陣列中的最小值及最大值,並分別存入 Min 及 Max。(注意:請加註解說明程式碼寫法) 【103.關務】
Thumbnail
2025/04/08
請使用 C 或 Java 語言寫一副程式,此副程式對一個長度為 10 的整數陣列 A[0:9],最多花費 15 次的數值比較運算,尋找陣列中的最小值及最大值,並分別存入 Min 及 Max。(注意:請加註解說明程式碼寫法) 【103.關務】
Thumbnail
2025/04/07
第 1 題 題目 設有一三維陣列(three dimensional matrix) A[1...u₁, 1...u₂, 1...u₃],請問其中一元素(element)A[i,j,k] 之儲存位置為何?其中 1 ≤ i ≤ u₁,1 ≤ j ≤ u₂,1 ≤ k ≤ u₃,請列出推導過程。
Thumbnail
2025/04/07
第 1 題 題目 設有一三維陣列(three dimensional matrix) A[1...u₁, 1...u₂, 1...u₃],請問其中一元素(element)A[i,j,k] 之儲存位置為何?其中 1 ≤ i ≤ u₁,1 ≤ j ≤ u₂,1 ≤ k ≤ u₃,請列出推導過程。
Thumbnail
2025/04/07
陣列和鏈結串列的比較以及陣列位址的計算方式
Thumbnail
2025/04/07
陣列和鏈結串列的比較以及陣列位址的計算方式
Thumbnail
看更多
你可能也想看
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
給定一個輸入陣列,每一個tuple代表節點之間了從屬關係。 請從從屬關係重建整顆二元樹,並且返回整顆二元樹的根結點。
Thumbnail
給定一個輸入陣列,每一個tuple代表節點之間了從屬關係。 請從從屬關係重建整顆二元樹,並且返回整顆二元樹的根結點。
Thumbnail
題目敘述 Binary Tree Maximum Path Sum 給定一個二元樹,請找出最大的區間路徑和是多少? 註: 區間路徑和 = 某個節點a -> 某個節點b的路徑節點值總和。
Thumbnail
題目敘述 Binary Tree Maximum Path Sum 給定一個二元樹,請找出最大的區間路徑和是多少? 註: 區間路徑和 = 某個節點a -> 某個節點b的路徑節點值總和。
Thumbnail
題目給定一個布林代數的二元樹,要求我們計算最後的結果。 葉子節點都是真假值 非葉子節點都是布林運算子
Thumbnail
題目給定一個布林代數的二元樹,要求我們計算最後的結果。 葉子節點都是真假值 非葉子節點都是布林運算子
Thumbnail
題目敘述 題目會給定一顆二元樹的根結點, 要求我們在指定的層樹d,插入新的一層,節點值為v。 原本的左、右子樹,就成為新的那一層的左子樹、右子樹。 題目的原文敘述 測試範例 Example 1: Input: root = [4,2,6,3,1,5], val = 1, depth =
Thumbnail
題目敘述 題目會給定一顆二元樹的根結點, 要求我們在指定的層樹d,插入新的一層,節點值為v。 原本的左、右子樹,就成為新的那一層的左子樹、右子樹。 題目的原文敘述 測試範例 Example 1: Input: root = [4,2,6,3,1,5], val = 1, depth =
Thumbnail
這篇文章,會帶著大家複習以前學過的二元搜尋樹(Binary Search Tree)框架, 並且以二分搜尋樹的概念與定義為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 二元搜尋樹(Binary Search Tree)的定義
Thumbnail
這篇文章,會帶著大家複習以前學過的二元搜尋樹(Binary Search Tree)框架, 並且以二分搜尋樹的概念與定義為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 二元搜尋樹(Binary Search Tree)的定義
Thumbnail
題目敘述 題目會給定一棵二元樹的根結點,要求我們判定這是否為一顆合法的奇偶二元樹? 奇偶二元樹的定義: 從上到下依序是第0層、第一層、...、第n層 偶數層裡面的節點值都必須是奇數,而且由左到右嚴格遞增。 奇數層裡面的節點值都必須是偶數,而且由左到右嚴格遞減。 題目的原文敘述 測試
Thumbnail
題目敘述 題目會給定一棵二元樹的根結點,要求我們判定這是否為一顆合法的奇偶二元樹? 奇偶二元樹的定義: 從上到下依序是第0層、第一層、...、第n層 偶數層裡面的節點值都必須是奇數,而且由左到右嚴格遞增。 奇數層裡面的節點值都必須是偶數,而且由左到右嚴格遞減。 題目的原文敘述 測試
Thumbnail
題目敘述 題目會給定一棵二元樹的根結點,要求我們找出這棵二元樹最後一層最左邊的值。 題目的原文敘述 測試範例 Example 1: Input: root = [2,1,3] Output: 1 Example 2: Input: root = [1,2,3,4,null,5,6
Thumbnail
題目敘述 題目會給定一棵二元樹的根結點,要求我們找出這棵二元樹最後一層最左邊的值。 題目的原文敘述 測試範例 Example 1: Input: root = [2,1,3] Output: 1 Example 2: Input: root = [1,2,3,4,null,5,6
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News