【數據結構】二叉樹的概念

01 概念

?定義:二叉樹既然叫二叉樹,顧名思義即度最大為2的樹稱為二叉樹。?它的度可以為 1 也可以為 0,但是度最大為 2 。?

一顆二叉樹是節點的一個有限集合,該集合:

? ? ?① 由一個根節點加上兩棵被稱為左子樹右子樹的二叉樹組成? ? ?

? ? ?② 或者為空

觀察上圖我們可以得出如下結論:

? ? ?① 二叉樹不存在度大于 2 的節點,換言之二叉樹最多也只能有兩個孩子。

? ? ?② 二叉樹的子樹有左右之分,分別為左孩子右孩子。次序不可顛倒,因此二叉樹是有序樹。

注意:對于任意的二叉樹都是由以下幾種情況復合而成的

02 滿二叉樹

定義:一個二叉樹,如果每一層的結點數都達到了最大值(均為2),則這個二叉樹就可以被稱作為 "滿二叉樹" 。

換言之,如果一個二叉樹的層數為 h,且總結點數為 2的 h 次方 - 1,那么它就是一個滿二叉樹。

計算公式:

?① 已知層數求總數:N = 2^h-1

?② 已知總數求層數:?h = log_2(N+1)

03 完全二叉樹

定義:對于深度為 h?的,有 n 個結點的二叉樹,當且僅當其每一個結點都與深度為 h?的滿二叉樹中編號從 1 至 n 的結點一一對應時稱之為完全二叉樹。

前 h - 1 層是滿的,最后一層不滿,但最后一層從左到右是連續的。

完全二叉樹是效率很高的數據結構,完全二叉樹是由滿二叉樹而引出來的。所以,滿二叉樹是一種特殊的完全二叉樹(每一層節點均為2)。

常識:

① 完全二叉樹中,度為 1 的最多只有 1 個。

② 高度為?h?的完全二叉樹節點范圍是? ?[ 2^{h-1} - 1 + 1, 2^{h} - 1 ]??

04 二叉樹的性質

四點規則:

① 若規定根節點的層數為 1 ,則一顆非空二叉樹的第 i 層上最多有 2?的 i - 1 次方個節點。

② 若規定根節點的層數為 1 ,則深度為 h 的二叉樹最大節點數是 2 的 h 次方 - 1。

③ 對任何一棵二叉樹,如果度為 0 其葉子結點個數為 n0,度為 2 的分支節點個數為 n2,則有n0 = n2 + 1。換言之,度為 0 的永遠比度為 2 的多一個葉子結點。

假設二叉樹有 n 個結點,從總結點數角度考慮:n?= n0 + n1 + n2,從邊的角度考慮,n 個結點的任意二叉樹,總共有 n - 1 條邊。因為度為 0 的結點沒有孩子,故度為 0?的結點不產生邊; 度為 1 的結點只有一個孩子,故每個度為 1 的結點產生一條邊; 度為 2 的結點有 2 個孩子,故每個度為 2 的結點產生兩條邊,所以總邊數為: n1+2*n2,故從邊的角度考慮:n - 1 = n1 + 2*n2,?n0 + n1 + n2 = n1 + 2*n2 - 1,即:n0 = n2 + 1

④ 若規定根節點的層數為 1 , 具有 n 個節點的滿二叉樹的深度 h = log(n + 1)。

對于具有n個結點的完全二叉樹,如果按照從上至下從左至右的數組順序對所有節點從0開始編號,則對于序號為i的結點有:

? 1. 若 i > 0,i 位置節點的雙親序號:(i - 1) / 2;i = 0,i 為根節點編號,無雙親節點。

? 2. 若2i + 1 < n,左孩子序號:2i + 1,2i + 1 >= n否則無左孩子。

? 3. 若2i + 2 < n,右孩子序號:2i + 2,2i + 2 >= n否則無右孩子。

05 二叉樹的存儲

1 數組存儲

一般情況下使用數組來存儲,只適合完全二叉樹。

如果是非完全二叉樹,會造成空間上的浪費。

2 鏈式存儲

typedef struct BinaryTreeNode
{struct BinTreeNode* left; // 左孩子struct BinTreeNode* right; // 右孩子DataType data; // 當前節點值域
}BTree;

06 二叉樹的遍歷

二叉樹的遍歷一般有四種方法:前序遍歷,中序遍歷,后序遍歷,層序遍歷。

1 前序遍歷

先遍歷根節點,再依次遍歷左子樹,右子樹。而遍歷左子樹,又要先遍歷根節點,再依次遍歷左子樹,右子樹…直至遍歷到空樹。

// 遞歸實現
void PreOrder(BTree*root)
{if (root == NULL)return;printf("%d ", root->data);//根節點PreOrder(root->left);//左子樹PreOrder(root->right);//右子樹
}

2 中序遍歷

先遍歷左子樹,再依次遍歷根節點,右子樹。而遍歷左子樹,又要先遍歷左子樹,再依次遍歷根節點,右子樹…直至遍歷到空樹。

// 遞歸實現
void Inorder(BTree*root)
{if (root == NULL)return;PreOrder(root->left);//左子樹printf("%d ", root->data);//根節點PreOrder(root->right);//右子樹
}

3 后序遍歷

先遍歷左子樹,再依次遍歷右子樹,根節點。而遍歷左子樹,又要先遍歷左子樹,再依次遍歷右子樹,根節點…直至遍歷到空樹。

// 遞歸實現
void Postorder(BTree*root)
{if (root == NULL)return;PreOrder(root->left);//左子樹PreOrder(root->right);//右子樹printf("%d ", root->data);//根節點
}

4 層序遍歷

層序遍歷顧名思義就是一層一層地遍歷,這時就需要借助一個數據結構:隊列來輔助實現。

void leverOrder(BTree* root, Queue* pq)
{if (root == NULL)return;QueuePush(pq, root);//插入第一個節點while (!QueueEmpty(pq))//隊列不為空{BTree* p = QueueFront(pq);printf("%d ", p->val);QueuePop(pq);if (p->left != NULL)//帶入左孩子{QueuePush(pq, p->left);}if (p->right != NULL)//帶入右孩子{QueuePush(pq, p->right);}}
}

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

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

相關文章

【RK3576】【Android14】如何在Android14下單獨編譯kernel-6.1?

單獨編譯kernel依賴如下幾個源碼&#xff1a;【交叉編譯工具鏈】prebuilts/clang/host/linux-x86/clang-r487747c【內核源碼】kernel-6.1為什么Android下編譯內核使用clang作為交叉編譯工具鏈而不是GCC&#xff1f;Android 14 選擇使用預置的 Clang 工具鏈&#xff08;如 clang…

什么是Redis的Pipeline

介紹Redis的Pipeline是一種網絡優化技術&#xff0c;在沒有Pipeline的時候&#xff0c;客戶端往redis發送請求&#xff0c;客戶端需要等到redis響應之后才能發送下一個請求。而Pipeline&#xff0c;使redis可以一次性接收多個請求。減少了通信次數&#xff0c;顯著的提高了性能…

【ElementUI el-table跨頁勾選】

一、el-table需加上refs和 row-key屬性 二、type"selection"勾選框 需加上 reserve-selection儲備選擇屬性 三、在分頁請求數據時&#xff0c;觸發 setSelected()方法 四、在 selection-change變化時保存 selectedRows <el-table ref"tables" :data&quo…

論文閱讀/博弈論/拍賣:《Truthful Auction for Cooperative Communications》

摘要&#xff1a;一方面&#xff0c;協作通信由于其在提升無線網絡容量方面的巨大潛力而日益受到關注。另一方面&#xff0c;協作通信技術的實際應用卻很少見&#xff0c;即使在一些對帶寬需求極高的應用場景中&#xff0c;系統設計者也并未采用協作通信技術來開發創新的網絡解…

系統軟中間件:連接軟件與硬件的橋梁

理解“系統軟中間件”這個術語很重要&#xff0c;它實際上是兩個緊密相關但又不同的概念的組合&#xff1a; 系統軟件中間件 嚴格來說&#xff0c;“系統軟中間件”不是一個標準的獨立術語。它通常指的是屬于系統軟件范疇的中間件&#xff0c;或者理解為作為系統軟件重要組成部…

音視頻學習(六十四):avc1 hvc1和hev1

基礎概念縮寫編碼標準FourCC說明AVC/H.264Advanced Video Codingavc1最常用的 H.264 編碼標識符&#xff0c;兼容 MP4/MOV/FMP4 等容器。HEVC/H.265High Efficiency Video Codinghvc1HEVC 視頻流在 MP4/FMP4 中常用標識符&#xff0c;要求存儲 NALU 的 VPS/SPS/PPS&#xff08;…

【WIT】編程百問一

01 什么時postman&#xff1f; Postman 是一款專門用于幫助開發人員處理 API 的工具&#xff0c;它的作用主要有以下幾個方面&#xff1a; 方便調試 API&#xff1a;就像你打電話給別人要先撥對號碼一樣&#xff0c;開發人員要讓不同的軟件系統之間通過 API 進行通信&#xff…

RAG 從入門到放棄?丐版 demo 實戰筆記(go+python)

背景 我當前有一個業務系統&#xff0c;希望能添加一個機器人助手。直接使用大模型&#xff0c;由于缺少相關的業務數據&#xff0c;效果并不理想&#xff0c;了解一下 RAG。 什么是 RAG RAG(Retrieval Augmented Generation)&#xff0c;搜索引擎 大模型。 簡單來說就是從…

《IDEA 突然“三無”?三秒找回消失的綠色啟動鍵、主菜單和項目樹!》

目錄 一、左上角綠色啟動鍵憑空消失 1.1 解決辦法 二、頂部 File / Edit / View... 整條主菜單欄 罷工 2.1 解決辦法 三、左側 Project 工具窗口 集體失聯&#xff0c;只剩 External Libraries 孤零零 3.1 解決辦法 昨天下午擼代碼&#xff0c;不知道按到了哪兒&#xff…

軟件工程實踐二:Spring Boot 知識回顧

文章目錄一、創建項目&#xff08;Spring Boot 向導&#xff09;二、項目最小代碼示例三、運行與驗證四、標準目錄結構與說明五、Maven 依賴最小示例&#xff08;僅供參考&#xff09;六、常用配置&#xff08;application.yml 示例&#xff09;七、返回 JSON 與統一異常八、Va…

【系列文章】Linux中的并發與競爭[04]-信號量

【系列文章】Linux中的并發與競爭[04]-信號量 該文章為系列文章&#xff1a;Linux中的并發與競爭中的第4篇 該系列的導航頁連接&#xff1a; 【系列文章】Linux中的并發與競爭-導航頁 文章目錄【系列文章】Linux中的并發與競爭[04]-信號量一、信號量二、實驗程序的編寫2.1驅動…

Elasticsearch啟動失敗?5步修復權限問題

文章目錄&#x1f6a8; 為什么會出現這個問題&#xff1f;? 解決方案&#xff1a;修復數據目錄權限并確保配置生效步驟 1&#xff1a;確認數據目錄存在且權限正確步驟 2&#xff1a;確認 elasticsearch.yml 中的配置步驟 3&#xff1a;**刪除或清空 /usr/share/elasticsearch/…

Docker push 命令:鏡像發布與管理的藝術

Docker push 命令&#xff1a;鏡像發布與管理的藝術1. 命令概述2. 命令語法3. 核心參數解析4. 推送架構圖解5. 完整工作流程6. 實戰場景示例6.1 基礎推送操作6.2 企業級推送流程6.3 多架構鏡像推送7. 鏡像命名規范詳解8. 安全最佳實踐8.1 內容信任機制8.2 最小權限原則9. 性能優…

智能合約測試框架全解析

概述 智能合約測試庫是區塊鏈開發中至關重要的工具&#xff0c;用于確保智能合約的安全性、正確性和可靠性。以下是主流的智能合約測試庫及其詳細解析。 一、主流測試框架對比 測試框架開發語言主要特點適用場景Hardhat WaffleJavaScript/TypeScript強大的調試功能&#xf…

【大模型算法工程師面試題】大模型領域新興的主流庫有哪些?

文章目錄 大模型領域新興主流庫全解析:國產化適配+優劣對比+選型指南(附推薦指數) 引言 一、總覽:大模型工具鏈選型框架(含推薦指數) 二、分模塊詳解:優劣對比+推薦指數+選型建議 2.1:訓練框架(解決“千億模型怎么訓”) 2.2:推理優化(解決“模型跑起來慢”) 2.3:…

端口打開與服務可用

端口打開與服務可用“端口已打開但服務不可用” 并非矛盾&#xff0c;而是網絡訪問中常見的分層問題。要理解這一點&#xff0c;需要先明確 “端口打開” 和 “服務可用” 的本質區別&#xff1a;1. 什么是 “端口打開”&#xff1f;“端口打開” 通常指 操作系統的網絡層監聽該…

ByteDance_FrontEnd

約面了&#xff0c;放輕松&#xff0c;好好面 盲點 基礎知識 Function 和 Object 都是函數&#xff0c;而函數也是對象。 Object.prototype 是幾乎所有對象的原型鏈終點&#xff08;其 proto 是 null&#xff09;。 Function.prototype 是所有函數的原型&#xff08;包括 Obje…

go語言,彩色驗證碼生成,加減法驗證,

代碼結構相關代碼 captcha/internal/captcha/generator.go package captchaimport (_ "embed" // &#x1f448; 啟用 embed"image""image/color""image/draw""image/png""io""math/rand""golang.…

PuTTY軟件訪問ZYNQ板卡的Linux系統

PuTTY 是一款非常經典、輕量級、免費的 SSH、Telnet 和串行端口連接客戶端&#xff0c;主要運行于 Windows 平臺。它是在開源許可下開發的&#xff0c;因其小巧、簡單、可靠而成為系統管理員、網絡工程師和開發人員的必備工具。網上有非常多的下載資源。 我們使用PuTTY軟件對ZY…

做一個RBAC權限

在分布式應用場景下&#xff0c;我們可以利用網關對請求進行集中處理&#xff0c;實現了低耦合&#xff0c;高內聚的特性。 登陸權限驗證和鑒權的功能都可以在網關層面進行處理&#xff1a; 用戶登錄后簽署的jwt保存在header中&#xff0c;用戶信息則保存在redis中網關應該對不…