數據結構(六)——樹和二叉樹

一、樹和二叉樹的定義與存儲

1.樹的定義

樹是一種非線性的數據結構,它是由n個有限結點組成有層次關系的集合

樹具有以下特點:

(1)每個結點具有0個或多個子結點

(2)每個子結點只有一個父結點

(3)沒有前驅的結點為根結點

(4)除了根結點外,每個子結點又可以由m棵不相關的子樹組成

2.樹的基本術語

(1)結點的度:結點擁有的子樹數量稱為結點的度

(2)樹的度:樹內各結點度的最大值,即上圖 D結點的度就是此樹的度

(3)葉子:度為 0的節點稱為葉子或終端節點

(4)結點的層次和樹的深度

結點的從根開始定義起,根為第一層,根的孩子為第二層,以此類推,樹的深度或高度是樹中結點的最大層次

(5)森林:m棵互不相交的樹的集合

3.二叉樹與樹主要有以下區別:

(1)二叉樹每個結點至多只有兩顆子樹(即二叉樹中不能存在度大于2的結點)

(2)二叉樹的子樹有左右之分,其次序不能任意顛倒

(3)即使樹中某結點只有一顆子樹,也要區分它是左子樹還是右子樹

4.二叉樹的性質:

性質1:在二叉樹的第i層上至多有 2的i-1次方 個結點(i>=1)

性質2:深度為k的二叉樹至多有 2的k次方-1?個結點(k>=1)

性質3:對任何一棵二叉樹T,如果其終端結點數為n0,度為2的結點數為n2,則n0=n2+1

【證明】一棵二叉樹,除了終端結點(葉子結點),就是度為1或2的結點。假設n1表示度為1的結點數,則樹T的結點總數n=n0+n1+n2,我們再換個角度,看一下樹T的連接線數,除了根節點,其他結點都有一根線表示分支進入,所以連接線數為結點總數減去1。按連接線樹算的話:n-1=n1+2n2,可推導出n0+n1+n2-1=n1+2n2,繼續推導可得n0=n2+1

性質4:具有n個結點的完全二叉樹的深度為(這里的[]是向下取整)

性質5:如果對一顆有n個結點的完全二叉樹(其深度為)的結點按層序編號(從第1層到第層,每層從左到右),對任一結點i(1<=i<=n)有:

(1)如果 i = 1,則結點 i 是二叉樹的根,無雙親;如果 i > 1,則其雙親是結點[i/2]

(2)如果 2i > n,則結點 i 無孩子(結點 i 為葉子結點);否則其左孩子是結點 2i

(3)如果 2i+1 > n ,則結點i無右孩子;否則其右孩子是結點 2i+1

5.二叉樹的存儲:順序存儲、鏈式存儲

(1)二叉樹的順序存儲結構缺點很明顯:不能反應邏輯關系;對于特殊的二叉樹(左斜樹、右斜樹),浪費存儲空間。所以二叉樹順序存儲結構一般只用于完全二叉樹

(2)二叉樹的鏈式存儲

//二叉樹的二叉鏈表存儲表示
typedef struct BiTNode{
//結點數據域TElemType data;
//左右孩子指針struct BiTNode *1child,*r1child;
}BiTNode,*BiTree;

?

二、二叉樹的遍歷

二叉樹的遍歷:按某條搜索路徑訪問二叉樹中每一個結點,使得每個結點被訪問一次且僅被訪問一次。遍歷方法有4種:先序遍歷,中序遍歷,后序遍歷,層次遍歷

1.先序遍歷

(1)訪問根節點

(2)先序遍歷左子樹

(3)先序遍歷右子樹

先序遍歷序列(根左右):abcdfge

2.中序遍歷

(1)中序遍歷左子樹

(2)訪問根節點

(3)中序遍歷右子樹

中序遍歷序列(左根右):bafgdce

3.后序遍歷

(1)后序遍歷左子樹

(2)后序遍歷右子樹

(3)訪問根結點

后序遍歷序列(左右根):bgfdeca

簡便方法:

4.層序遍歷

按層次(1-k層),每層從左到右依次訪問二叉樹中的每個結點

層次遍歷序列:abcdefg

eg:已知二叉樹先序遍歷序列是:abcdefg;中序遍歷序列是:cbdaefg

(1)畫出該二叉樹

(2)寫出后序遍歷序列??

cdbgfea

三、哈夫曼樹

1.基本概念識記

(1)路徑:從一個結點到另一個結點之間的分支序列

(2)路徑長度:從一個結點到另一個結點所經過的分支數目

(3)結點的權:根據應用的需要可以給樹的結點賦權值

(4)結點的帶權路徑長度:從根到該結點的路徑長度與該結點權的乘積

(5)樹的帶權路徑長度:樹中所有葉子結點的帶權路徑之和

其中,n是樹的葉結點個數,wk是第k個葉子的權,lk是第k個葉子到根的路徑長度。

(6)哈夫曼樹:由n個帶權葉子結點構成的所有二叉樹中帶權路徑長度最短的二叉樹

n個葉子結點的哈弗曼樹有(2n-1) 個結點

在構造哈弗曼樹時,是從葉子結點向根節點的方向進行的,每次都是兩個兩個成對的結點來形成一個新的分支結點,所以不存在度為1的結點。

2.哈夫曼樹的構造

對于有n個葉子結點,可以構造出多個二叉樹。但Huffman樹是一個帶權路徑長度最小的二叉樹,又稱最優二又樹。方法:

(1)將{w1,w2.,…,wn}看成n個二叉樹;
(2)選擇2個根結點的值最小的二叉樹,構造1個新的二叉樹;......; 直至剩1個樹止。

eg:某系統在通信聯絡中只可能出現8個字符,其出現概率分別是:

Z? ?K? ?F? ?C? ?U? ?D? ?L? ?E

2? ?7? 24? 32? 37 42? 42? 120

請構造哈夫曼樹

(1)排序:

(2)依次選取兩個最小的連在一起

進行排版:

3.哈夫曼編碼

前綴碼:如果在一個編碼系統中,任一個編碼都不是其他任何編碼的前綴,則稱該編碼系統中的編碼是前綴碼。例如,一組編碼01,001,010,100,110就不是前綴碼,因為01是010的前綴,若去掉01或010就是前綴碼。

哈夫曼編碼:對一棵具有n個葉子的哈夫曼樹,若對樹中的每個左分支賦予0,右分支賦子1,則從根到每個葉子的通路上,各分支的賦值分別構成一個二進制串,該二進制串就稱為哈夫曼編碼。

哈夫曼編碼是最優前綴碼

?

四、習題

答案:A

解釋:因為二叉樹有左孩子、右孩子之分,故一棵樹轉換成二叉樹之后,這棵二叉樹的形態是唯一的

答案:D

解釋:枚舉法

??

答案:D

解釋:設度為0結點((葉子結點)個數為A,度為1的結點個數為B,度為2的結點個數為C,有A=C+1,A+B+C=1001,可得2C+B=1000,由完全二叉樹的性質可得B=0或1,又因為C為整數,所以B=0,C=500,A=501,即有501個葉子結點。

答案:C?

解釋:若每層僅有一個結點,則樹高h為1025;且其最小樹高為[log2 1025]+1=11,即h在11至1025之間。

?答案:A

解釋:深度為h的滿m叉樹共有 m的h次方-1 個結點,第k層有 m的k次方-1 個結點

答案:C

?解釋:因為先序遍歷結果是“根左右”,后序遍歷結果是“左右根”,當沒有左子樹時,就是“根右”和“右根”;當沒有右子樹時,就是“根左”和“左根”。則所有的結點均無左孩子或所有的結點均無右孩子均可,所以A、B不能選又所有的結點均無左孩子與所有的結點均無右孩子時,均只有一個葉子結點,故選C。

答案: B

解釋:在哈夫曼樹中沒有度為1的結點,只有度為0(葉子結點)和度為2的結點。設葉子結點的個數為n0,度為2的結點的個數為n2,由二叉樹的性質n0=n2+1,則總結點數n=n0+n2=2*n0-1,得到n0=100。

答案:A

解釋:哈夫曼樹的構造過程是每次都選取權值最小的樹作為左右子樹構造一棵新的二叉樹,所以樹中一定沒有度為1的結點、兩個權值最小的結點一定是兄弟結點、任一非葉結點的權值一定不小于下一層任一結點的權值

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

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

相關文章

DICOM 網絡服務實現:醫學影像傳輸與管理的技術實踐

?? 博主簡介:CSDN博客專家、CSDN平臺優質創作者,高級開發工程師,數學專業,10年以上C/C++, C#, Java等多種編程語言開發經驗,擁有高級工程師證書;擅長C/C++、C#等開發語言,熟悉Java常用開發技術,能熟練應用常用數據庫SQL server,Oracle,mysql,postgresql等進行開發應用…

TongWeb7.0常用-D參數說明

Web容器相關啟動參數配置 屬性 含義 -Dtongweb.restart.interval 設置宕機后重啟的時間間隔&#xff0c;以秒為單位。如果不設置這個參數&#xff0c;默認為1秒 -Dmonitor.abnormal.restart 設置服務器非正常狀態時是否重啟&#xff0c;如果不設置這個參數或者參數值不為…

軟件架構評估方法全面解析

介紹 在軟件開發過程中&#xff0c;架構設計的好壞直接影響系統的可維護性、可擴展性和性能。因此&#xff0c;軟件架構評估&#xff08;Software Architecture Evaluation&#xff09;成為確保架構質量的關鍵步驟。本文將介紹幾種主流的架構評估方法&#xff0c;包括ATAM、SA…

我開源了一個免費在線工具!UIED Tools

UIED Tools - 免費在線工具集合 最近更新&#xff1a;修改了文檔說明&#xff0c;優化了項目結構介紹 這是設計師轉開發的第一個開源項目&#xff0c;bug和代碼規范可能有些欠缺。 這是一個功能豐富的免費在線工具集合網站&#xff0c;集成了多種實用工具&#xff0c;包括 AI …

【vue】全局組件及組件模塊抽離

一、全局組件 只要是實例化過的區域都可以使用 Vue.component("組件名",{ template: 內容} ) 二、組件模塊抽離 抽離就是把template的內容寫到body里面&#xff0c;然后建立id寫到變量下的template里&#xff0c;id變量寫到component里 body{ template&#xff1a; …

深入理解 iOS 開發中的 `use_frameworks!`

在使用 CocoaPods 管理 iOS 項目依賴時&#xff0c;開發者經常會在 Podfile 文件中看到一個配置選項&#xff1a;use_frameworks!。本文將詳細介紹這個配置選項的含義&#xff0c;以及如何決定是否在項目中使用它。 一、什么是 use_frameworks! 在 CocoaPods 中引入第三方庫時…

《Python星球日記》 第57天:LSTM 與 GRU

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 目錄 一、LSTM 的門控機制1. LSTM 結構概述2. 遺忘門(Forget Gate)3. 輸入門(Input Gate)4. 輸出門(Output Gate)5. 記憶單元更新過程二、GRU 的簡化…

Java SE所需工具與常見類型和運算符介紹

1.Java SE所需工具 1.1 JDK JDK全稱為Java Develepment Kit(Java開發者工具包&#xff09;&#xff0c;包括了Java運行環境JRE&#xff08;Java Runtime Envirnment&#xff09;、一堆Java工具&#xff08;javac/java/jdb等&#xff09;和Java基礎的類庫&#xff08;即Java A…

QT6.8安裝教程

官網下載 鏈接&#xff1a; Index of /official_releases/online_installers 這個比較慢 建議去 清華大學開源軟件鏡像站&#xff1a;Index of /qt/archive/online_installers/4.9/ | 清華大學開源軟件鏡像站 | Tsinghua Open Source Mirror 根據自己什么系統選擇 點擊打開…

MIT XV6 - 1.3 Lab: Xv6 and Unix utilities - primes

接上文 MIT XV6 - 1.2 Lab: Xv6 and Unix utilities - pingpong primes 繼續實驗&#xff0c;實驗介紹和要求如下 (原文鏈接 譯文鏈接) : Write a concurrent prime sieve program for xv6 using pipes and the design illustrated in the picture halfway down this page and…

hive兩個表不同數據類型字段關聯引發的數據傾斜

不同數據類型引發的Hive數據傾斜解決方案 #### 一、?原因分析? 當兩個表的關聯字段存在數據類型不一致時&#xff08;如int vs string、bigint vs decimal&#xff09;&#xff0c;Hive會觸發隱式類型轉換引發以下問題&#xff1a; ?Key值的精度損失?&#xff1a;若關聯字…

【JAVA】業務系統訂單號,流水號生成規則工具類

設計業務系統訂單號&#xff0c;流水號注意事項 唯一性&#xff1a;確保在分布式環境下ID不重復 有序性&#xff1a;ID隨時間遞增&#xff0c;有利于數據庫索引性能 可讀性&#xff1a;包含時間信息&#xff0c;便于人工識別 擴展性&#xff1a;支持業務前綴和類型區分 性能…

【嵌入式開發-SPI】

嵌入式開發-SPI ■ SPI簡介■ SPI &#xff08;Standard SPI&#xff09;■ DSPI &#xff08;Dual SPI&#xff09;■ QSPI是 Queued SPI的簡寫 ■ SPI簡介 SPI協議其實是包括&#xff1a;Standard SPI、Dual SPI和Queued SPI三種協議接口&#xff0c;分別對應3-wire, 4-wire…

基于HTTP頭部字段的SQL注入:SQLi-labs第17-20關

前置知識&#xff1a;HTTP頭部介紹 HTTP&#xff08;超文本傳輸協議&#xff09;頭部&#xff08;Headers&#xff09;是客戶端和服務器在通信時傳遞的元數據&#xff0c;用于控制請求和響應的行為、傳遞附加信息或定義內容類型等。它們分為請求頭&#xff08;Request Headers&…

基于Qt開發的http/https客戶端

成果展示&#xff1a; 使用Qt開發HTTP客戶端主要依賴QNetworkAccessManager、QNetworkRequest和QNetworkReply三大核心類。以下是具體實現要點及最佳實踐&#xff1a; 一、核心類與基礎流程?? 1.QNetworkAccessManager?? 作為HTTP請求的管理者&#xff0c;負責異步處理…

自適應蒙特卡洛定位-AMCL

自適應蒙特卡洛定位&#xff0c;簡稱AMCL&#xff0c;主要提供定位功能并以/tf形式輸出 蒙特卡洛算法的基本思想&#xff1a;當所要求的問題是某種事件出現的概率或者是某個變量的期望值時&#xff0c;它們可以通過某種"試驗"的方法&#xff0c;得到這種事件出現的概…

魯濱遜歸結原理詳解:期末考點+解題指南

1. 引言 歸結原理&#xff08;Resolution Principle&#xff09; 是自動定理證明和邏輯推理的核心技術&#xff0c;由約翰艾倫羅賓遜&#xff08;John Alan Robinson&#xff09;于1965年提出。它是一階謂詞邏輯的機械化推理方法&#xff0c;廣泛應用于人工智能&#xff08;如…

華為云Flexus+DeepSeek征文|DeepSeek-V3/R1商用服務開通教程以及模型體驗

在當今數字化浪潮迅猛推進的時代&#xff0c;云計算與人工智能技術的深度融合正不斷催生出眾多創新應用與服務&#xff0c;為企業和個人用戶帶來了前所未有的便利與發展機遇。本文將重點聚焦于在華為云這一行業領先的云計算平臺上&#xff0c;對 DeepSeek-V3/R1 商用服務展開的…

Matlab基于PSO-MVMD粒子群算法優化多元變分模態分解

Matlab基于PSO-MVMD粒子群算法優化多元變分模態分解 目錄 Matlab基于PSO-MVMD粒子群算法優化多元變分模態分解效果一覽基本介紹程序設計參考資料效果一覽 基本介紹 PSO-MVMD粒子群算法優化多元變分模態分解 可直接運行 分解效果好 適合作為創新點(Matlab完整源碼和數據),以包…

自然語言處理NLP中的連續詞袋(Continuous bag of words,CBOW)方法、優勢、作用和程序舉例

自然語言處理NLP中的連續詞袋&#xff08;Continuous bag of words&#xff0c;CBOW&#xff09;方法、優勢、作用和程序舉例 目錄 自然語言處理NLP中的連續詞袋&#xff08;Continuous bag of words&#xff0c;CBOW&#xff09;方法、優勢、作用和程序舉例一、連續詞袋( Cont…