【數據結構】二叉樹:簡約和復雜的交織之美

專欄引入:

哈嘍大家好,我是野生的編程萌新,首先感謝大家的觀看。數據結構的學習者大多有這樣的想法:數據結構很重要,一定要學好,但數據結構比較抽象,有些算法理解起來很困難,學的很累。我想讓大家知道的是:數據結構非常有趣,很多算法是智慧的結晶,我希望大家在學習數據結構的過程是一種愉悅的心情感受。因此我開創了《數據結構》專欄,在這里我將把數據結構內容以有趣易懂的方式展現給大家。

1.二叉樹?

?生活中,我們經常會遇到管理大量數據的情況,比如圖書館書記的分類。而二叉樹這種數據結構正是用來解決這種問題的,當我們閱讀書時,書中的每個條目都有專門分類和子分類,為了更好的組織這些內容,需要使用一種高效的數據結構來存儲和訪問信息。下面舉個簡單的例子來引入二叉樹,我們在中學學習生物時知道了植物主要分為:種子植物、苔蘚植物等。那它們是如何進行分類的呢?我們看下面這張圖片:

通過這種方式,我們可以逐級展開二叉樹,更詳細的組織植物分類的信息,每個節點都代表一個特定的分類,而子節點則代表該分類的下一級分類。這樣我們可以更加輕松的查找和比較不同的植物分類信息。下面我們就來揭開二叉樹的神秘面紗。

1.1二叉樹的定義

二叉樹是n(n>=0)個節點的有限集合,該集合或者為空集合(稱為空二叉樹),或者由一個根節點和兩棵互不相交的、分別稱為根節點的左子樹和右子樹的二叉樹組成。在下面的圖中,左邊的就是一棵二叉樹,而右邊的因為它的F節點有3個子節點,所以它不是二叉樹。

1.2二叉樹的特點

?二叉樹具有以下幾個特點:

  1. 每個節點最多有兩個子節點,所以二叉樹中不存在度大于2的節點。注意不是一定要有兩個節點,而是最多有兩個節點,沒有節點或者只有一個節點也是可以滴。
  2. 左子樹和右子樹是有順序的,次序不能顛倒,因此二叉樹是有序樹。
  3. 即使結構中某節點只有一個子節點,也要區分它是左節點還是右節點。

二叉樹具有以下五種基本形態:空二叉樹、只有一個根節點、根節點只有左子樹、根節點只有右子樹、根節點既有左子樹又有右子樹。

1.3特殊的二叉樹?

1.3.1斜樹

斜樹,顧名思義,斜樹一定是斜的,但是向哪里斜還是有講究的。所有節點都只有左子樹的二叉樹的叫做左斜樹,所有節點都只有右子樹的二叉樹叫做右斜樹,這兩者統稱為斜樹。在上一張圖中根節點只有左子樹和根節點只有右子樹就是左斜樹和右斜樹的一個簡單例子。斜樹也有很明顯的特點,就是每一層只有一個節點,節點個數和二叉樹的深度相同。肯定也有人好奇:這也叫樹?這不和線性表一樣嗎?確實,線性表可以理解成樹的一種極其特殊的表現形式。

1.3.2滿二叉樹

我們通常舉例子都是參差不齊的二叉樹,那是否存在完美的二叉樹呢?我們看下面這張圖片:

看來完美的二叉樹是存在的。在一棵二叉樹中,如果所有分支節點都存在左子樹和右子樹,并且所有葉子都在一層上,這樣的二叉樹叫做滿二叉樹。下面就是一個滿二叉樹,從樣子上看就感覺它很完美:

單是每一個節點都存在左右子樹,不能算滿二叉樹,還必須要所有葉子都在一層上,這樣才能做到整棵樹的平衡。因此,滿二叉樹的特點有:

  1. 葉子只能出現在最底層,出現在其他層就不能達到平衡狀態。
  2. 除了葉子節點外,每個節點都有兩個子節點。即所有非葉子節點的度都為2.
  3. 在同樣深度的二叉樹中,滿二叉樹的節點個數最多,葉子數最多。

滿二叉樹的每一層都是滿的,沒有任何缺失節點。由于每個節點都具有兩個子節點,滿二叉樹的平衡性很好。這使得在滿二叉樹上執行搜索、插入和刪除等操作的平均時間復雜度非常高效。在滿二叉樹中,從根節點到任意一個葉子節點的路徑長度都相同,是最短的路徑。滿二叉樹常用于堆數據結構。滿二叉樹在實際應用中比較少見,因為它要求節點數必須是2的冪次方,而真實的數據往往不具備這樣的特點。

1.3.3完全二叉樹

對一棵具有n個節點的二叉樹進行層序編號,如果編號為i(1≤i≤n)的節點與同樣深度的滿二叉樹中的編號為i的節點在二叉樹中的位置完全相同,則這棵二叉樹稱為完全二叉樹。如下圖:

在理解時,我們要注意區分滿二叉樹和完全二叉樹。首先,從字面上區分,“完全”和“滿”的區別,滿二叉樹一定是一棵完全二叉樹,完全二叉樹不一定是滿的。其次,完全二叉樹的所有節點和同樣深度的滿二叉樹,它們按層序編號相同的節點,是一一對應的,這個關鍵詞是按層序編號。像下面的二叉樹中,因為5節點沒有右子樹,只有左子樹,使得按層序編號的第11個編號空檔了,它不是完全二叉樹:

?只有下面圖中的樹,盡管它不是滿二叉樹,但編號是連續的,所以它是完全二叉樹:

這里我們就可以總結出完全二叉樹的一些特點:

  1. 葉子節點只能出現在最后兩層。
  2. 最下層的葉子節點一定是集中在左部連續位置。
  3. 倒數第二層,如果有葉子節點,一定都在右部連續位置。
  4. 如果節點的度為1,則該節點只有左孩子,及不存在右子樹的情況。
  5. 同樣節點數的二叉樹,完全二叉樹的深度最小。

通過上面的理解,我們也知道了一個判斷二叉樹是否是完全二叉樹的方法:那就是看樹的示意圖,給每個節點按照滿二叉樹的結構逐層順序編號,如果編號出現空擋,就說明不是完全二叉樹,反之就是。完全二叉樹在實際應用中較為常見,它具有以下的優點:

  1. 節點的存儲更加高效:由于完全二叉樹的特點,可以使用數組來存儲節點。這樣可以大大節省存儲空間,因為不需要為每個節點額外存儲左右子節點的指針。
  2. 訪問效率更高:由于節點的存儲更加高效,可以使用數組的索引來訪問節點。這樣可以實現隨機訪問,訪問的時間復雜度是O(1)。而在其他類型的二叉樹中,如果要找到某個節點,需要從根節點出發進行遍歷,訪問的時間復雜度較高。

1.4二叉樹的性質?

1.4.1二叉樹的性質1

在二叉樹的第i層至多有2^{i-1}個節點(i≥1)。這個性質很容易理解,我們觀察一下滿二叉樹:

第一層是根節點,只有一個,所以2^{0}=1。第二層有兩個,2^{1}=2。第三層有四個,2^{2}=4。第四層有八個,2^{3}=8。通過數據歸納法的論證,我們可以很輕松的得出在二叉樹的第i層上至多有2^{i-1}個節點(i≥1)的結論。這個性質的重要性在于它給出了二叉樹的每一層上節點數量的上限。通過這個性質,我們可以更好地理解和分析二叉樹的結構。同時,這個性質也為二叉樹的遍歷、搜索等操作提供了重要的依據和限制。

1.4.2二叉樹的性質2

深度為k的二叉樹至多有2^{k}-1個節點(k≥1)。這里一定要注意,是2^{k}后再減1,而不是2^{k-1}。如果不注意的話很容易和性質1搞混。深度為k也就是有k層的二叉樹,我們接著以上面那個滿二叉樹為例來看:如果只有一層,至多有2^{1}-1=1個節點。如果只有兩層,至多有2^{2}-1=1+2個節點。如果只有三層,至多有2^{3}-1=1+2+4個節點。如果只有四層,至多有2^{4}-1=1+2+4+8個節點通過數據歸納法,我們可以得出:二叉樹的深度為k層,此二叉樹至多有2^{k}-1個節點。

1.4.3二叉樹的性質3

對于任何一棵二叉樹,如果其終端節點數為n_{0},度為2的節點數為n_{2},則n_{0}=n_{2}+1這是一個非常重要的性質,首先我們從二叉樹的構建過程一步一步來理解它:

首先,我們先看只有一個根節點的時候,度為0的節點個數n0=1,度為2的節點的個數為n2=0。我們設度為1的節點的個數為n1,接著,我們給根節點加一個節點,這時候一定會減少一個度為0的節點(一個度為0的節點變為度為1的節點),然后再加一個度為0的節點(新增的節點因為沒有子節點,所以增加一個度為0的節點),度為0的節點個數變化之后和之前的個數一樣,所以n0仍為1,n2仍為0。然后,我們再加一個節點,這時候會減少一個度為1的節點,然后增加一個度為0的節點和一個度為2的節點?(度為1的節點變來)。通過這個規律我們可以發現度為0的節點比度為2的節點多1個,即n0=n2+1。

同時我們也可以發現樹節點的總數為n=n0+n1+n2。通過下圖的例子,節點總數為10,它是由A、B、C、D度為2的節點,F、G、H、I、J度為0的葉子節點和E這個度為1的節點組成的。總和為4+1+5=10。

因為這個性質很重要,刷題時會經常出現考察這個性質的題,我從網上找了兩個試題來幫助大家對這個性質加深印象:

1.某二叉樹共有 399 個結點,其中有 199 個度為 2 的結點,則該二叉樹中的葉子結點數為

?( )
? ?A 不存在這樣的二叉樹

? ?B 200
? ?C 198
? ?D 199
答案:C

2.在具有 2n 個結點的完全二叉樹中,葉子結點個數為( )

??A n
? B n+1
? C n-1
? D n/2

答案:A

解析:根據題意,我們可以知道:n0+n1+n2=2n,n0=n2+1,所以n0+n1+n0-1=2n,即? ? ? ? ? ? ? ? ? ?2n0+n1-1=2n我們在接著分析這棵樹是一個完全二叉樹,所以度為1的節點個數為0或? ? ? ? ? ? ?1,因為n0、n1、n2的值為整數,所以我們可以得出n1為1,然后解開這個方程就知? ? ? ? ? ? ? ?道n0的值為n,即葉子節點個數為n。

1.4.4二叉樹的性質4?

具有n個節點的完全二叉樹的深度h=|\log_{2}n|+1(這里的 |x| 表示不大于x的最大整數)。由滿二叉樹的定義我們可以知道,深度為h的滿二叉樹的節點數n一定為2^{h}-1,因為這是最多的節點個數。那么對于n=2^{h}-1倒推可以得到滿二叉樹的深度為h=\log (n+1),完全二叉樹我們前面也提到過,它是一棵具有n個節點的二叉樹,如果按照層序編號后與同樣深度的滿二叉樹中編號節點在二叉樹中的位置完全相同,那他就是完全二叉樹,也就是說,它的葉子節點只會出現在最下面兩層,它的節點數一定小于等于同等深度的滿二叉樹的節點數2^{h}-1,但一定多于2^{h-1}-1,即滿足2^{h-1}-1<h\leqslant 2^{h}-1,由于節點數n是整數,n\leq 2^{h}-1意味著n< 2^{h}n>2 ^{h-1}-1意味著n\geq 2^{k-1},所以2^{h-1}\leq n< 2^{h},不等式兩邊取對數,得到h-1\leq \log_{2}n< h,而h作為深度也是整數,因此h=|\log_{2}n|+1。

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

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

相關文章

Transformer中的位置編碼PE(position encoding)

Transformer中的位置編碼PE(position encoding) 1.提出背景 transformer模型的attention機制并沒有包含位置信息&#xff0c;即一句話中詞語在不同的位置時在transformer中是沒有區別的 2.解決背景 給encoder層和decoder層的輸入添加了一個額外的向量Positional Encoding&a…

平移數據c++

題目描述 將a數組中第一個元素移到數組末尾,其余數據依次往前平移一個位置。 輸入 第一行為數組a的元素個數n&#xff1b; 第二行為n個小于1000的正整數。 輸出 平移后的數組元素&#xff0c;每個數用一個空格隔開。 樣例輸入 10 1 2 3 4 5 6 7 8 9 10 樣例輸出 2 3 …

【專利 超音速】一種光伏檢測系統

申請號CN202410053901.0公開號&#xff08;公開&#xff09;CN118032774A申請日2024.01.12申請人&#xff08;公開&#xff09;超音速人工智能科技股份有限公司發明人&#xff08;公開&#xff09;張俊峰(總); 葉長春(總); 許春夏 摘要 本發明公開一種光伏檢測系統&#xff0…

iotdb時序庫在火電設備鍋爐場景下的實踐【原創文字,IoTDB社區可進行使用與傳播】

一.概述 1.1 說明 本文章主要介紹iotdb數據庫在電站鍋爐工業場景下&#xff0c;對輔助智能分析與預警的使用介紹。 【原創文字&#xff0c;IoTDB社區可進行使用與傳播】 1.2 項目背景 隨著人工智能算法在電力領域的發展&#xff0c;以及燃煤鍋爐設備精細化調整需求的增加&…

Java基礎八股

Java基礎八股 Java語言Java語言有什么特點Java與C區別Java如何實現跨平臺JVMvsJDKvsJRE標識符和關鍵字的區別是什么自增自減運算符移位運算符continue,break,return的區別是什么final,finally,finalize的區別final關鍵字的作用時什么 變量 Java語言 Java語言有什么特點 Java是…

LED燈編程:一步步探索光的魔法

LED燈編程&#xff1a;一步步探索光的魔法 在數字時代&#xff0c;LED燈早已超越了傳統的照明功能&#xff0c;成為編程與創意結合的完美載體。那么&#xff0c;LED燈怎么編程呢&#xff1f;本文將分四個方面、五個方面、六個方面和七個方面&#xff0c;帶您走進LED燈編程的奇…

如何在Python中管理內存

在Python中&#xff0c;內存管理主要是由解釋器自動處理的&#xff0c;這包括對象的分配和回收。Python使用引用計數和垃圾回收機制來管理內存&#xff0c;這大大簡化了開發者的工作&#xff0c;因為他們通常不需要手動管理內存。 然而&#xff0c;盡管Python自動管理內存&…

數據結構——經典鏈表OJ(二)

樂觀學習&#xff0c;樂觀生活&#xff0c;才能不斷前進啊&#xff01;&#xff01;&#xff01; 我的主頁&#xff1a;optimistic_chen 我的專欄&#xff1a;c語言 點擊主頁&#xff1a;optimistic_chen和專欄&#xff1a;c語言&#xff0c; 創作不易&#xff0c;大佬們點贊鼓…

chatgpt之api的調用問題

1.調用api過程中&#xff0c;出現如下報錯內容 先寫一個測試樣例 import openaiopenai.api_key "OPEN_AI_KEY" openai.api_base"OPEN_AI_BASE_URL" # 是否需要base根據自己所在地區和key情況進行completion openai.ChatCompletion.create(model"g…

【intro】GNN中異構圖(heterogeneous graph)綜述

本篇博客內容是讀兩篇論文&#xff0c;兩篇論文連接如下&#xff1a; Heterogeneous graph neural networks analysis: a survey of techniques, evaluations and applications A Survey on Heterogeneous Graph Embedding: Methods, Techniques, Applications and Sources …

瓦羅蘭特國際服 外服游玩教程 瓦羅蘭特外服下載注冊游玩指南

瓦羅蘭特國際服 外服游玩教程 瓦羅蘭特外服下載注冊游玩指南 瓦羅蘭特作為當今游戲圈頂流的一款熱門FPS。游戲&#xff0c;作為拳頭游戲公司劃時代的一款游戲。游戲不僅延續了傳統FPS游戲的玩法&#xff0c;還添加許多新玩法&#xff0c;這也是游戲可以吸引大批量玩家的原因之…

Flink面試整理-對Flink的高級特性如CEP(復雜事件處理)、狀態后端選擇和調優等有所了解

Apache Flink 提供了一系列高級特性,使其成為一個強大的實時數據處理框架,特別適用于復雜的數據處理場景。其中,復雜事件處理(CEP)、狀態后端的選擇和調優是其中重要的幾個方面。 復雜事件處理(CEP) CEP 概念:CEP 是用于在數據流中識別復雜模式的技術。它允許用戶指定事…

基于電導增量MPPT控制算法的光伏發電系統simulink建模與仿真

目錄 1.課題概述 2.系統仿真結果 3.核心程序與模型 4.系統原理簡介 5.完整工程文件 1.課題概述 基于電導增量MPPT控制算法的光伏發電系統simulink建模與仿真。輸出MPPT跟蹤后的系統電流&#xff0c;電壓以及功率。 2.系統仿真結果 3.核心程序與模型 版本&#xff1a;MAT…

cocos creator 3.x實現手機虛擬操作桿

簡介 在許多移動游戲中&#xff0c;虛擬操縱桿是一個重要的用戶界面元素&#xff0c;用于控制角色或物體的移動。本文將介紹如何在Unity中實現虛擬操縱桿&#xff0c;提供了一段用于移動控制的代碼。我們將討論不同類型的虛擬操縱桿&#xff0c;如固定和跟隨&#xff0c;以及如…

Go常見語法題目解析

1、寫出下面代碼輸出內容。 package mainimport ("fmt" )func main() {defer_call() }func defer_call() {defer func() { fmt.Println("打印前") }()defer func() { fmt.Println("打印中") }()defer func() { fmt.Println("打印后")…

快速冪

a^b % q 給定整數 a b q&#xff0c; 求 a 的 b 次方 mod q 根據題目數字取值范圍&#xff0c;不能暴力處理。 會有兩個問題&#xff1a; 1、計算 a 的次方會超出范圍 2、不能循環 b 次計算 a 的乘積&#xff0c;會超時 處理問題1&#xff1a; 每計算一次 a 的乘積&#xf…

視頻匯聚平臺EasyCVR對接GA/T 1400視圖庫結構化數據:人員/人臉、非/機動車、物品

在信息化浪潮席卷全球的背景下&#xff0c;公安信息化建設日益成為提升社會治理能力和維護社會穩定的關鍵手段。其中&#xff0c;GA/T 1400標準作為公安視頻圖像信息應用系統的核心規范&#xff0c;以其結構化數據處理與應用能力&#xff0c;為公安信息化建設注入了強大的動力。…

【圖解IO與Netty系列】Reactor模型

Reactor模型 Reactor模型簡介三類事件與三類角色Reactor模型整體流程 各種Reactor模型單Reactor單線程模型單Reactor多線程模型主從Reactor模型 Reactor模型簡介 Reactor模型是服務器端用于處理高并發網絡IO請求的編程模型&#xff0c;與傳統的一請求一線程的同步式編程模型不…

翼龍面板是什么,如何進行搭建

翼龍面板是一個開源的&#xff0c;用于游戲服務器管理的程序&#xff0c;可以方便地在網頁界面中創建Minecraft&#xff0c;起源引擎游戲和Teamspeak3 服務器。 它使用前后端程序&#xff0c;因此可以創建多后端節點&#xff0c;對游戲服務器和服務器節點進行統一管理。 對游戲…

Vue進階之Vue無代碼可視化項目(二)

Vue無代碼可視化項目 項目初始化路由子路由錯誤示范正確示范App.vuerouter/index.tsAboutView.vueAboutAboutview.vuerouter/index.ts項目路由router/index.tsApp.vueActionsView.vueDataSourceView.vueLayoutView.vue路由樣式App.vue進一步的App.vue項目初始化 路由 router i…