【數據結構與算法】數據結構初階:詳解二叉樹(一)

🔥個人主頁:胡蘿卜3.0

🎬作者簡介:C++研發方向學習者

📖個人專欄:??《C語言》《數據結構》?《C++干貨分享》

??人生格言:不試試怎么知道自己行不行

正片開始之前,我們來了解一下我們即將要來介紹、學習的這個數據結構——二叉樹。

二叉樹的作用:

(1)快速查找
二叉樹(尤其是二叉排序樹)可以用于高效的數據查找,其查找的時間復雜度為 O(log?n),最壞情況下為O(n)。這種特性使得二叉樹特別適合需要頻繁查找、插入和刪除操作的場景。

(2)動態數據管理
由于二叉樹支持動態查詢,并且可以通過調整樹的結構來優化性能(例如 AVL 樹、紅黑樹),它被廣泛應用于需要動態管理數據的場景,如數據庫索引和內存管理。

(3)有序序列生成
中序遍歷一棵二叉排序樹可以得到一個關鍵字的有序序列,這使得二叉樹成為一種有效的排序工具。構造二叉排序樹的過程本質上就是對無序序列進行排序的過程。

(4)樹狀結構表示
許多現實世界的問題可以用樹狀結構來建模,例如網站目錄結構、文件系統等。雖然這些結構可能不是嚴格的二叉樹,但通過適當的轉換,它們可以使用二叉樹的相關算法來處理。

應用場景:

(1)網頁爬蟲中的遍歷
在互聯網工程中,當需要下載某個網站的所有網頁時,可以利用二叉樹的遍歷算法來模擬這一過程。這種算法能夠確保所有頁面都被訪問到,并且按照一定的順序進行處理。

(2)二叉樹的展開
在某些特定的應用中,比如將二叉樹轉換為鏈表形式,可以通過遞歸的方式實現。例如,在先序遍歷的順序下,左子樹會被移到右指針位置,而左子樹的最后一個節點會指向原來的右子樹。

(3)平衡二叉樹的應用
平衡二叉樹(如 AVL 樹、紅黑樹)通過保持樹的高度平衡來確保查找、插入和刪除操作的時間復雜度始終為O(logn)。這類樹結構廣泛應用于需要高性能數據檢索的場景,例如數據庫索引和操作系統調度器。

(4)表達式樹
表達式樹是一種特殊的二叉樹,其中葉子節點表示操作數,內部節點表示運算符。這種結構可以用于解析和求值數學表達式,并且在編譯器設計中具有重要應用。

(5)哈夫曼編碼
哈夫曼樹是一種帶權路徑長度最短的二叉樹,常用于數據壓縮領域。通過構建哈夫曼樹,可以生成最優前綴編碼,從而減少存儲空間或傳輸成本。

(6)決策樹
在機器學習和人工智能領域,二叉樹可以用來表示決策過程。每個節點代表一個特征判斷,每個分支代表一個可能的結果,最終的葉子節點則代表最終的決策結果。

二叉樹這個部分學起來不會容易,但是會讓你覺得很有收獲,你慢慢會覺得學二叉樹很爽!


目錄

正文?

一、樹

1.1 樹的概念與結構

1.2 非樹形結構

1.3 樹的相關術語

1.4 樹的表示方法--孩子兄弟表示法

1.5 屬性結構實際運用場景

二、二叉樹

2.1 二叉樹的概念與結構

2.2 特殊的二叉樹

2.2.1 滿二叉樹

2.2.2 完全二叉樹

三、二叉樹的存儲結構

3.1 順序結構

3.2 鏈式結構


正文?

一、樹

樹是什么?數據結構中的樹和自然界中的樹有什么聯系嗎?有。

樹的根在地下,故曰“向陽而生”;樹形結構的根在上面——

1.1 樹的概念與結構

樹是一種非線性的數據結構,它是由n(n>=0)有限結點組成一個具有層次結構的集合。我們把它叫做樹是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。

  • 有一個特殊的結點,稱為根節點,根節點沒有前驅結點。(根節點稱為父節點/雙親結點)
  • 除根節點外,其余結點被分成M(M>0)個互不相交的集合(T1、T2、……、Tm),其中每一個集合Ti(1<=i<=m)又是一棵結構與樹類似的子樹。每棵樹的根節點有且只有一個前驅,可以有0個或者多個后繼。因此,樹是遞歸定義的。
1.2 非樹形結構

在樹形結構中,子樹之間不能有交集,否則就不是樹形結構!!!如果子樹之間有交集,那就是非樹形結構

上圖中的三個都是非樹形結構,紅方框內的子樹有交集

注意:

  • 子樹是不相交的(如果存在相交就是圖了,圖以后得課程會有講解)
  • 除了根結點外,每個結點有且僅有一個父節點
  • ?棵N個結點的樹有N-1條邊(記憶方式:2個結點有一條邊)
1.3 樹的相關術語

下圖就是一個樹形結構——

父結點/雙親結點若一個結點含有子結點,則這個結點稱為其子結點的父結點,如上圖:A是B的父結點。

子結點/孩子結點一個結點含有的子樹的根結點稱為該結點的子結點,如上圖:B是A的孩子結點。

結點的度一個結點有幾個孩子,他的度就是多少,比如A的度為6,F的度為2,K的度為0。

樹的度一棵樹中,最大的結點的度稱為樹的度,如上圖:樹的度為6。

葉子結點/終端結點度為0的結點稱為葉結點,如上圖: B、C、H、I . . .等結點為葉結點。

分支結點/非終端結點度不為0的結點,如上圖: D、E、F、G... 等結點為分支結點。

兄弟結點具有相同父結點的結點互稱為兄弟結點(必須是親兄弟),如上圖: B、C 是兄弟結點。

結點的層次從根開始定義起,根為第 1 層,根的子結點為第 2 層,以此類推

樹的高度或深度樹中結點的最大層次,如上圖:樹的高度為4。

結點的祖先從根到該結點所經分支上的所有結點,如上圖: A 是所有結點的祖先。

路徑:一條從樹中任意節點出發,沿父結點 - 子節點連接,達到任意節點的序列,比如A到Q的路徑為: A-E-J-Q、H到Q的路徑H-D-A-E-J-Q。

子孫以某結點為根的子樹中任一結點都稱為該結點的子孫,如上圖:所有結點都是A的子孫。

森林由m(m>0)棵互不相交的樹的集合稱為森林
?

1.4 樹的表示方法--孩子兄弟表示法

樹結構相對線性表就比較復雜了,要存儲表示起來就比較麻煩了,既要保存值域,也要保存結點和結點之間的關系,實際中樹有很多種表示方式如:雙親表示法,孩子表示法、孩子雙親表示法以及孩子兄弟表示法等。我們這里就簡單的了解其中最常用的孩子兄弟表示法:

struct TreeNode
{struct Node* child; // 左邊開始的第?個孩?結點struct Node* brother; // 指向其右邊的下?個兄弟結點int data; // 結點中的數據域
}

比如說下面這幅圖中的樹結構:

我們用孩子兄弟表示法可以這樣表示——

1.5 屬性結構實際運用場景

文件系統是計算機存儲和管理文件的一種方式,它利用樹形結構來組織和管理文件和文件夾。在文件系統中,樹結構被廣泛應用,它通過父結點和子結點之間的關系來表示不停層級的文件和文件夾之間的關聯。

二、二叉樹

2.1 二叉樹的概念與結構

在樹形結構中,我們最常用的就是二叉樹,一棵二叉樹是結點的一個有限集合,該集合由一個根節點加上兩棵分別稱為左子樹和右子樹的二叉樹組成或者二叉樹為空。

結構:

從上圖可以看出:

  1. 二叉樹不存在度大于2的結點(0,1,2)
  2. 二叉樹的子樹有左右之分,次序不能顛倒,因此二叉樹是有序樹

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

因此二叉樹不是很好駕馭,于是我們定義了特殊的二叉樹,比如滿二叉樹、完全二叉樹等。

2.2 特殊的二叉樹

樹->二叉樹->特殊的二叉樹->滿二叉樹

2.2.1 滿二叉樹

滿二叉樹(度為2,即最大結點個數為2),每一層結點數都最大,層數為K,結點總數為2^(k-1),這就是滿二叉樹。

滿二叉樹的結點總數是怎么求出來的呢?

2.2.2 完全二叉樹

完全二叉樹是效率很高的數據結構,完全二叉樹是由滿二叉樹而引出來的。

簡單來說

完全二叉樹就是:除了最后一層,其他每層結點個數都達到最大,最后一層結點個數不一定達到最大,滿二叉樹就是完全二叉樹的一種,并且完全二叉樹的結點從左向右依次排列。

完全二叉樹就是:除了最后一層,其他每層結點個數都達到最大,最后一層結點個數不一定達到最大,滿二叉樹就是完全二叉樹的一種,并且完全二叉樹的結點從左向右依次排列。

完全二叉樹的每層結點的個數達到最大就是滿二叉樹;除了最后一層,其他每層結點個數都達到最大就是完全二叉樹

完全二叉樹的結點是從左往右依次排列的——

這是非常重要的一個知識點,觀察下圖,是不是一個完全二叉樹——

缺一個左孩子,這樣一來不是從左到右依次排列了,就不是完全二叉樹

二叉樹的性質:

三、二叉樹的存儲結構

二叉樹一般可以使用二中存儲結構,一種順序結構,一種鏈式結構

3.1 順序結構

順序結構存儲就是使用數組來存儲,一般使用數組只適合表示完全二叉樹因為不是完全二叉樹會有空間的浪費,完全二叉樹更適合使用順序結構存儲。

我們通常把堆(一種二叉樹)使用順序結構的數組來存儲,需要注意的是這里的堆和操作系統虛擬進程地址空間中的堆是兩回事,一個是數據結構,一個是操作系統中管理內存的一塊區域分段

鏈表結構

3.2 鏈式結構

二叉樹的鏈式存儲結構是指用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關系

通常的方法是鏈表中每個結點由三個域組成,數據域和左右指針域,左右指針分別用來給出該結點左孩子和右孩子所在的鏈結點的存儲地址。

鏈式結構又分為二叉鏈和三叉鏈,當前我們學習中?般都是二叉鏈。后面的學習中會學到高階數據結構如紅黑樹等會用到三叉鏈。

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

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

相關文章

工具測試 - marker (Convert PDF to markdown + JSON quickly with high accuracy)

參考鏈接如下&#xff1a;&#xff1a; 參考鏈接&#xff1a;https://github.com/datalab-to/marker?tabreadme-ov-file#llm-services 底層的OCR模型&#xff1a;https://github.com/datalab-to/surya 作用&#xff1a;開源免費&#x1f193;&#xff0c;多 GPU 推理、生成效…

STM32HAL 快速入門(七):GPIO 輸入之光敏傳感器控制蜂鳴器

STM32HAL 快速入門&#xff08;七&#xff09;&#xff1a;GPIO 輸入之光敏傳感器控制蜂鳴器 前言 大家好&#xff0c;這里是 Hello_Embed。上一篇我們用 GPIO 輸入模式實現了按鍵控制 LED&#xff0c;本篇將進階到 “光敏傳感器控制蜂鳴器”—— 通過讀取光敏傳感器的信號&…

windows環境,安裝kafka

步驟 1: 準備工作 確保已安裝 Java&#xff1a;Kafka 需要 Java 運行時環境 (JRE) 或 Java 開發工具包 (JDK) 來運行。請確認您的系統上已安裝了 Java&#xff0c;并且 JAVA_HOME 環境變量正確配置。 解壓 Kafka&#xff1a;將下載的 Kafka 壓縮包解壓到一個目錄&#xff0c;比…

機器翻譯60天修煉專欄介紹和目錄

文章目錄 第一章:機器翻譯基礎認知與語言學鋪墊 第二章:經典機器翻譯模型(統計機器翻譯) 第三章:神經網絡基礎與詞向量技術 第四章:神經機器翻譯(NMT)基礎架構 第五章:NMT模型進階與訓練實踐 第六章:預訓練模型與機器翻譯應用 第七章:研究前沿與綜合項目 導論:學習…

openwrt增加自定義網頁

一. 簡介 本文介紹在OpenWRT中使用Luci框架定制設備配置頁面的方法,包括添加靜態頁面和參數配置頁面的過程,以及如何利用lua腳本實現界面與功能的結合。 二. Luci介紹 UCI 是 Openwrt 中為實現所有系統配置的一個統一接口,英文名 Unified Configuration Interface,即統一…

微服務的編程測評系統11-jmeter-redis-競賽列表

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄前言1. 退出登錄1.1 后端1.2 前端2. 獲取當前用戶信息3. C端用戶競賽列表功能3.1 后端3.2 Jmeter-基本操作3.3 數據版本性能測試-壓力測試3.4 redis版本-緩存結構設計…

海濱浴場應急廣播:守護碧海藍天的安全防線

海濱浴場應急廣播&#xff1a;守護碧海藍天的安全防線&#xff01;海濱浴場&#xff0c;是人們休閑娛樂、親近自然的理想場所。然而&#xff0c;變幻莫測的海洋環境也潛藏著諸多安全隱患&#xff0c;如溺水、離岸流、海蜇蜇傷、極端天氣等。為了有效應對突發事件&#xff0c;保…

華曦達港股IPO觀察丨以創新研發為筆,構建AI Home智慧生活新藍圖

深圳市華曦達科技股份有限公司自創立伊始&#xff0c;便將敏銳的市場洞察與前沿技術追蹤視為生命線。通過構建一支卓越的研發團隊&#xff0c;公司專注于自主核心技術的深耕與積累&#xff0c;以精密的硬件與創新的軟件筑起堅實的技術壁壘。其精心打造的“技術創新&#xff0d;…

構建現代化的Web UI自動化測試框架:從圖片上傳測試實踐說起

構建現代化的Web UI自動化測試框架&#xff1a;從圖片上傳測試實踐說起如何設計一個可維護、可擴展的Web UI自動化測試框架&#xff1f;本文通過一個圖片上傳測試實例&#xff0c;詳細介紹專業測試框架的搭建與實踐。當前測試框架結構 首先&#xff0c;讓我們了解一下當前的測試…

Apache IoTDB:大數據時代時序數據庫選型的技術突圍與實踐指南

摘要&#xff1a;時序數據庫在大數據時代迎來爆發式增長&#xff0c;IoTDB作為Apache頂級開源項目展現出顯著優勢&#xff1a;1. 性能卓越&#xff1a;支持千萬級數據點/秒寫入&#xff0c;18:1高壓縮比&#xff0c;查詢延遲低至500ms&#xff1b;2. 創新架構&#xff1a;采用樹…

2025年8月16日(星期六):雨騎古蓮村游記

清晨&#xff0c;當第一縷微光還未完全驅散夜幕的靜謐&#xff0c;我們這群由校長領銜的騎行愛好者已整裝待發。咖啡節早市尚未開攤&#xff0c;空氣中彌漫著一種期待與寧靜交織的氛圍&#xff0c;仿佛連時間都在為我們即將開啟的旅程而放慢腳步。今天的目標是古蓮村&#xff0…

Pandas數據預處理中缺失值處理

一、缺失值的概念表現形式1.數據庫中常用null表示2.部分編程語言中用NA表示3.可能表現為空字符串&#xff08;‘’&#xff09;或特定數值4.在Pandas中統一用NaN表示&#xff08;來自NumPy庫&#xff0c;NaN、NAN、nan本質一致&#xff09;NaN的特性1.與任何值都不相等&#xf…

計算機網絡:(十五)TCP擁塞控制與擁塞控制算法深度剖析

> 當網絡變成"堵城",TCP如何化身智能交通指揮家?揭秘百萬級并發背后的流量控制藝術! ### 一、生死攸關:為什么需要擁塞控制? **真實災難案例**:1986年勞倫斯伯克利實驗室網絡大崩潰,因缺乏擁塞控制導致全網癱瘓36小時。TCP擁塞控制由此誕生,核心解決**資…

python中的單下劃線“_”與雙下劃線“__”的使用場景及“左右雙下劃線”(魔術方法:`__xxx__`)

在Python中&#xff0c;單下劃線“_”和雙下劃線“__”的使用場景和含義有顯著區別&#xff0c;主要體現在命名約定和語法 一、單下劃線“_”的使用場景 單下劃線更多是編程約定&#xff08;而非強制語法&#xff09;&#xff0c;用于傳遞特定的“暗示”&#xff0c;不影響代碼…

我們為什么需要時序數據庫?

引言在當今數據驅動的世界中&#xff0c;時間序列數據正以前所未有的速度增長。從物聯網設備傳感器、金融交易記錄到應用程序性能監控&#xff0c;時間序列數據無處不在。傳統的關系型數據庫在處理這類數據時往往力不從心&#xff0c;這時時序數據庫(Time Series Database, TSD…

python-林粒粒的視頻筆記1

python的方法和函數指什么 可變類型和不可變類型 不可變類型&#xff0c;比如字符串通過方法調用后&#xff0c;字符串本身的值不改變 要改變需要重新賦值才能進行改變 比如可變數據類型類型&#xff0c;調用方法后可以直接改變原列表 因此&#xff0c;可變數據類型需要再重新賦…

CentOS 7的下載與安裝

一 、CentOS 7的下載與安裝 注意&#xff1a; CentOS 7 已于2024年6月30日停止維護&#xff01; 1、下載 由于 centos 7 已經停止維護&#xff0c;部分鏡像網站移除了對centos 7的支持&#xff0c;這里找到了部分現在還可以使用的鏡像網站 阿里云開源鏡像站&#xff1a;http…

礦物分類系統開發筆記(二):模型訓練[刪除空缺行]

目錄 一、階段銜接與開發目標 二、數據準備 三、模型選擇與訓練 1. 邏輯回歸&#xff08;LR&#xff09; 2. 隨機森林&#xff08;RF&#xff09; 3. 高斯樸素貝葉斯&#xff08;GNB&#xff09; 4. 支持向量機&#xff08;SVM&#xff09; 5. AdaBoost 6. XGBoost 四…

通信方式:命名管道

一、命名管道 1. 命名管道的原理 有了匿名管道&#xff0c;理解命名管道就非常簡單了。 對于普通文件而言&#xff0c;兩個進程打開同一個文件&#xff0c;OS是不會將文件加載兩次的&#xff0c;這兩個進程都會指向同一個文件&#xff0c;那么&#xff0c;也就享有同一份 in…

如何將數據庫快速接入大模型實現智能問數,實現chatbi、dataagent,只需短短幾步,不需要配置工作流!

智能問數系統初始化操作流程 一、系統初始化與管理員賬號創建登錄與初始化提示&#xff1a;首次訪問系統登錄頁&#xff0c;若系統未初始化&#xff0c;會彈出 “系統未完成初始化&#xff0c;請初始化管理員賬號” 提示&#xff0c;點擊【去創建】。填寫管理員信息&#xff1a…