數據結構:滿二叉樹 (Full Binary Tree) 和 完全二叉樹 (Complete Binary Tree)

目錄

重要的術語澄清

完美二叉樹 (Perfect Binary Tree)

完全二叉樹 (Complete Binary Tree)

大比拼 (Comparison)

相互關系的第一性推導?


我們來深入探討兩種在算法中非常重要的、具有特定“形狀”的二叉樹:滿二叉樹 (Full Binary Tree) 和 完全二叉樹 (Complete Binary Tree)。

最關鍵的是,我們會將它們與之前學過的嚴格二叉樹 (Strict Binary Tree) 進行詳細的比較。

數據結構:嚴格二叉樹 (Strict Binary Tree)-CSDN博客

這三者之間的區別和聯系是常考點,也是一個非常容易混淆的地方,所以這次的第一性推導會特別注重辨析。


重要的術語澄清

在開始之前,我必須先解決一個長期困擾學習者的問題:術語混亂。

  1. Strict Binary Tree (嚴格二叉樹): 我們已經學過,定義非常清晰——每個節點要么有0個孩子,要么有2個孩子。

  2. Full Binary Tree: 這是最混亂的術語。

    • 在很多國際經典教材(如《算法導論》)和學術界中,"Full Binary Tree" 就是我們學的 "Strict Binary Tree"。

    • 但是,在中國國內的很多教材中,“滿二叉樹” 指的是一種結構最完美的樹,即所有葉子都在同一層。為了避免這種語義混淆,我們把這種最完美的樹稱為 完美二叉樹 (Perfect Binary Tree)

  3. Complete Binary Tree (完全二叉樹): 這個術語的定義是統一的,沒有爭議。

為了本次學習的清晰性,我們將采用以下定義:

  • 嚴格二叉樹 (Strict Binary Tree): 度為0或2。

  • 完美二叉樹 (Perfect Binary Tree): 國內教材中的“滿二叉樹”,是一種極致形態。

  • 完全二叉樹 (Complete Binary Tree): 為數組表示法而生的結構。


完美二叉樹 (Perfect Binary Tree)

讓我們從一個問題開始——一棵二叉樹最“完美”、最“飽滿”、最“對稱”的形態應該是什么樣的?

推導1 ——飽滿:要想“飽滿”,內部就不應該有任何浪費的空間。

任何一個非葉子節點,如果只掛了一個孩子,那它的另一個孩子位就空著,這不“飽滿”。

所以,所有非葉子節點都必須有兩個孩子。(這恰好是嚴格二叉樹的定義)。

推導2 ——對稱:?要想“對稱”,樹的末端應該是整齊劃一的。

如果有些葉子在第3層,有些在第4層,那這棵樹看起來就像參差不齊的灌木,不夠“完美”。

所以,所有的葉子節點必須在同一層

h = 2  (高度 2)●/ \●   ●/ \ / \●  ● ●  ●

將這兩個推論合二為一,就得到了完美二叉樹 (Perfect Binary Tree) 的定義:

一棵深度為 k 且有 2^(k + 1) ? 1 個節點的二叉樹。用更直觀的語言描述就是:

  1. 它是一棵嚴格二叉樹。

  2. 并且,它所有的葉子節點都在最下面一層。

這棵樹的形狀像一個完美的等腰三角形,沒有任何空缺。

性質:

  • 節點數與高度的關系是固定的:對于高度為 h 的完美二叉樹,其節點數 n 永遠是它能達到的最大值,不多不少,即 n = 2^(h + 1) ? 1。

  • 它是嚴格二叉樹的一種非常特殊的特例。


完全二叉樹 (Complete Binary Tree)

完美二叉樹的要求太苛刻了。如果我有6個節點,就無法構成一棵完美二叉樹(高度為1的完美樹有3個節點,高度為2的有7個)。

那么,在節點數不“完美”的情況下,如何讓樹的形態盡可能地緊湊、不浪費空間呢?

推導1 ——填充順序:?要想緊湊,我們應該從上到下,一層一層地去填充節點。不能第2層還沒滿,就去放第3層的節點。

所以,樹的所有層,除了最后一層,都必須是滿的(即構成一個完美二叉樹)。

推導2 ——最后一層的排列:?對于最后一層,節點可能沒有填滿。那這些節點應該怎么放?是隨便放,還是靠右放,還是靠左放?

為了“緊湊”,最自然的方式就是從左到右依次排列,中間不能有空隙。

滿二叉樹 (高度 2):●/ \●   ●/ \ / \●  ● ●  ●完全二叉樹(去掉最右葉子):●/ \●   ●/ \ / ●  ● ●

將這兩個推論合二為一,就得到了完全二叉樹 (Complete Binary Tree) 的定義:

一棵二叉樹,如果它除了最底層之外的其他各層都被完全填滿,并且最底層的所有節點都連續地集中在左邊,那么它就是一棵完全二叉樹。

這個“從上到下,從左到右,連續排列”的特性,使其與數組表示法完美契合!

數據結構:二叉樹的表示方式(Representation of Binary Trees)-CSDN博客

當你按層序遍歷一個完全二叉樹時,得到的節點序列可以不多不少、不留一個空位地(沒有-1作為占位符)存入一個數組中。

完全二叉樹這個概念,可以說就是為了高效的數組表示法而生的。 這是理解它的關鍵。


大比拼 (Comparison)

現在我們把三個概念放在一起,從不同維度進行比較。

對比維度嚴格二叉樹 (Strict)完美二叉樹 (Perfect)完全二叉樹 (Complete)
一句話定義節點度數要么是0,要么是2節點全滿,葉子在同一層節點按層序連續排列
允許的節點度只有 0 和 2只有 0 和 2可以是 0, 1, 2<br>(最多只允許有一個度為1的節點)
形狀要求無特定形狀要求,可高可矮必須是完美的金字塔形必須是“左對齊”的緊湊形狀
和別人的關系是一個比較寬泛的分類是嚴格二叉樹的特例<br>是完全二叉樹的特例不一定是嚴格二叉樹<br>(當節點總數為偶數時,必有1個度為1的節點)
數組表示法如果很“瘦”,會浪費巨大空間空間利用率100%,沒有浪費空間利用率100%,完美適配

相互關系的第一性推導?

我們可以把這些樹的集合想象成幾個圈:

1. 完美二叉樹是標準最嚴苛的。它既要求所有內部節點度為2(滿足嚴格定義),又要求節點是連續的(滿足完全定義)。

所以,完美二叉樹的圈是最小的,它同時位于嚴格樹和完全樹兩個圈的交集之內。

  • 完美 => 嚴格 (成立)

  • 完美 => 完全 (成立)

完美二叉樹: ●/     \●         ●/   \     /   \●     ●   ●     ●/ \   / \ / \   / \●  ●  ●  ● ● ●  ●  ●

2. 嚴格二叉樹只對節點的“度”有要求。它不關心節點是不是“左對齊”。你可以構造一棵嚴格二叉樹,它中間有空位,因此它不是完全二叉樹。

  • 嚴格 => 完全 (不成立)

嚴格二叉樹:●/   \●      ●/   \●     ●/ \   / \●   ● ●   ●

3. 完全二叉樹只對節點的“位置”有要求。它不關心節點的“度”。當節點總數是偶數時,必然會產生一個只有一個左孩子的節點,它的度是1,這就不滿足嚴格二叉樹的定義。

  • 完全 => 嚴格 (不成立)

完全二叉樹:●/     \●         ●/   \     /   \●     ●   ●     ●/ \   / ●  ●  ●  

結論:

  • 完美二叉樹 是最特殊、最規整的,它同時是一棵嚴格二叉樹和一棵完全二叉樹。

  • 嚴格二叉樹 和 完全二叉樹 是從兩個不同維度(“度” vs “位置”)對樹進行的約束,它們有交集(交集就是完美二叉樹),但誰也不是誰的子集。

理解了這些從基本原則出發的定義和它們之間的邏輯關系,你就再也不會把這幾個概念搞混了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93320.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93320.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93320.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenJDK 17的C1和C2編譯器實現中,方法返回前插入安全點(Safepoint Poll)的機制

OpenJDK 17 JIT編譯器堆棧分析-CSDN博客 在OpenJDK 17的C1和C2編譯器實現中&#xff0c;方法返回前插入安全點&#xff08;Safepoint Poll&#xff09;的機制主要涉及以下關鍵步驟&#xff0c;結合源代碼進行分析&#xff1a; 1. 安全點輪詢樁&#xff08;Safepoint Poll Stu…

【論文筆記】STORYWRITER: A Multi-Agent Framework for Long Story Generation

論文信息 論文標題&#xff1a;StoryWriter: A Multi-Agent Framework for Long Story Generation 論文作者&#xff1a;Haotian Xia, Hao Peng et al. (Tsinghua University) 論文鏈接&#xff1a;https://arxiv.org/abs/2506.16445 代碼鏈接&#xff1a;https://github.com/…

Cohere 開發企業級大型語言模型(LLM)

Cohere 是一家專注于開發企業級大型語言模型&#xff08;LLM&#xff09;的公司。該公司推出了一系列名為 “Command” 的模型&#xff0c;其中最強大的 “Command A” 于今年三月首次亮相 Cohere 還提供嵌入模型&#xff0c;這是一種將文件轉化為神經網絡可以理解的緊湊數值形…

Rust Web框架Axum學習指南之入門初體驗

一、準備階段 確保已經安裝 rust&#xff0c;開發環境使用 vscode 或者 rustrover 都可以。接著就可以創建項目&#xff0c;通過編輯器創建或者命令行創建都可以&#xff1a; cargo new axum-admin二、添加依賴 添加依賴如下&#xff1a; [package] name "axum-admin&quo…

autofit.js: 自動調整HTML元素大小的JavaScript庫

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

RocketMQ 命名服務器(NameServer)詳解

&#x1f680; RocketMQ 命名服務器&#xff08;NameServer&#xff09;詳解 NameServer 是 RocketMQ 架構中的輕量級路由發現服務&#xff0c;它不參與消息的收發&#xff0c;但承擔著整個集群的“地址簿”和“導航系統”的關鍵角色。 理解 NameServer 的設計與工作原理&#…

代碼隨想錄算法訓練營四十三天|圖論part01

深度優先搜索&#xff08;dfs&#xff09;理論基礎 dfs就是可一個方向去搜直到盡頭再換方向&#xff0c;換方向的過程就涉及到了回溯。 代碼框架 因為dfs搜索可一個方向&#xff0c;并需要回溯&#xff0c;所以用遞歸的方式來實現是最方便的。 先來回顧一下回溯法的代碼框架…

飛算JavaAI金融風控場景實踐:從實時監測到智能決策的全鏈路安全防護

目錄一、金融風控核心場景的技術突破1.1 實時交易風險監測系統1.1.1 高并發交易數據處理1.2 智能反欺詐系統架構1.2.1 多維度欺詐風險識別1.3 動態風控規則引擎1.3.1 風控規則動態管理二、金融風控系統效能升級實踐2.1 風控模型迭代加速機制2.1.1 自動化特征工程結語&#xff1…

Vue 組件二次封裝透傳slots、refs、attrs、listeners

最近寫了一個開源項目&#xff0c;有些地方需要二次封裝&#xff0c;需要透傳一些數據&#xff0c;需要注意的是ref&#xff0c;我這里使用倆種方式間接傳遞ref&#xff0c;具體如下&#xff1a; 使用&#xff1a; import VideoPlayer from ./index.jsVue.use(VideoPlayer)inde…

介紹大根堆小根堆

文章目錄一、核心定義與結構特性示例&#xff08;以“數組存儲堆”為例&#xff09;二、堆的兩個核心操作1. 插入操作&#xff08;以小根堆為例&#xff09;2. 刪除極值操作&#xff08;以小根堆為例&#xff0c;刪除根節點的最小值&#xff09;三、小根堆 vs 大根堆&#xff1…

【Html網頁模板】賽博朋克數據分析大屏網頁

目錄專欄導讀? 項目概述&#x1f3a8; 設計理念&#x1f6e0;? 技術架構核心技術棧設計模式&#x1f3af; 核心功能1. 視覺效果系統&#x1f308; 色彩體系2. 數據可視化模塊&#x1f4ca; 主圖表系統&#x1f4c8; 性能監控面板3. 實時數據流系統? 數據流動畫&#x1f4ca;…

【經典上穿突破】副圖/選股指標,雙均線交叉原理,對價格波動反應靈敏,適合捕捉短期啟動點

【經典上穿突破】副圖/選股指標&#xff0c;雙均線交叉原理&#xff0c;對價格波動反應靈敏&#xff0c;適合捕捉短期啟動點 這是一款結合短線與中線信號的趨勢跟蹤指標&#xff0c;通過雙均線交叉原理捕捉股價突破時機&#xff0c;適用于個股分析和盤中選股。 核心功能模塊&…

RK3568 NPU RKNN(四):RKNN-ToolKit2性能和內存評估

文章目錄1、前言2、目標3、完整的測試程序4、運行測試程序5、程序拆解6、總結1、前言 本文僅記錄本人學習過程&#xff0c;不具備教學指導意義。 2、目標 使用野火提供的示例程序&#xff0c;體驗 RKNN-ToolKit2 在PC端使用連板推理&#xff0c;進行性能和內存評估。 3、完…

ASP.NET 上傳文件安全檢測方案

一、前端初步過濾&#xff08;防誤操作&#xff09;<!-- HTML部分 --><input type"file" id"fileUpload" accept".jpg,.png,.pdf,.docx" /><button onclick"validateFile()">上傳</button><script>func…

Nacos Server 3.0.x安裝教程

前言 注&#xff1a; 1.Nacos Server 3.0.x 要求 JDK版本不低于17。 2.Nacos 2.2.0 及以上版本需要 Java 11 或更高版本。 3.Java 8&#xff0c;需要下載 Nacos 2.1.x 及以下版本 JDK17安裝 JDK官方下載地址&#xff1a;Oracle官網JDK下載地址 JDK17&#xff1a;JDK17下載地…

【數據庫干貨】六大范式速記

1NF、2NF、3NF、BCNF、4NF、5NF都是數據庫設計中的范式&#xff08;Normalization&#xff09;&#xff0c;用于確保數據庫中的數據結構盡可能地減少冗余&#xff0c;避免更新異常、插入異常、刪除異常等問題&#xff0c;從而提高數據的存儲效率和一致性。 本篇文章簡單講解下各…

Java開發主流框架搭配詳解及學習路線指南

文章目錄一、前言&#x1f517;二、主流Java框架搭配2.1 Spring Boot MyBatis-Plus Spring Cloud2.2 Spring Boot Spring Data JPA Spring Cloud2.3 Quarkus/Vert.x (響應式編程棧)三、技術選型建議四、Java學習路線指南階段1&#xff1a;Java基礎 (4-6周)階段2&#xff1a…

flutter-使用device_info_plus獲取手機設備信息完整指南

文章目錄1. 概述2. 安裝與配置3. 基本使用方法3.1. 創建實例3.2. 區分平臺獲取信息4. 詳細信息獲取4.1. Android 設備信息4.2. iOS 設備信息4.3. Web 瀏覽器信息4.4. Windows 設備信息5. 實戰示例6. 注意事項6.1. 權限問題6.2. 隱私保護6.3. 平臺差異處理6.4. 性能考慮7. 常見問…

Java 時間處理 API 全解析:從 JDK7 到 JDK8 的演進

個人主頁-愛因斯晨 友友們&#xff0c;互三咯~ 目錄 個人主頁-愛因斯晨 ?編輯 前言 一、JDK7 時間處理基石 ——Date 類 &#xff08;一&#xff09;Date 類基本功能 &#xff08;二&#xff09;Date 類的局限性 二、格式化時間好幫手 ——SimpleDateFormat 類 &#…

duiLib 實現鼠標拖動標題欄時,窗口跟著拖動

1、布局文件&#xff0c;窗口需設置可拖動的標題欄區域&#xff1a;2、HandleMessage函數中&#xff0c;處理WM_LBUTTONDOWN消息&#xff0c;判斷鼠標在標題欄&#xff0c;讓系統處理窗口移動。代碼片段如下&#xff1a;else if (uMsg WM_LBUTTONDOWN) {// 獲取鼠標點擊坐標PO…