深入理解【二叉樹】

?

📙作者簡介:?清水加冰,目前大二在讀,正在學習C/C++、Python、操作系統、數據庫等。

📘相關專欄:C語言初階、C語言進階、C語言刷題訓練營、數據結構刷題訓練營、有感興趣的可以看一看。

歡迎點贊 👍 收藏 ?留言 📝 如有錯誤還望各路大佬指正!

?每一次努力都是一種收獲,每一次堅持都是一種成長?? ? ? ?

?

a6c0473e16e249c2b9ca02e5b793f35e.gif#pic_center

目錄

?

?前言

1. 特殊二叉樹

1.1 滿二叉樹

1.2 完全二叉樹

1.3 二叉樹的性質

2. 搜索二叉樹

3. 練習

📖?題目一

📖?題目二

📖?題目三?

總結


?

?

?前言

????????在計算機科學領域中,二叉樹作為一種重要的數據結構,被廣泛應用于各種算法和問題的解決方案中。然而,對于許多人來說,二叉樹仍然是一個神秘而復雜的概念。本篇博客將帶領你一同深入探索二叉樹的內在結構和特性,幫助你建立起對二叉樹的全面理解。


1. 特殊二叉樹

?????????前邊我們已經介紹了樹的結構,也了解了普通二叉樹,以及二叉樹的遍歷,今天我們將會繼續深入學習二叉樹。

1.1 滿二叉樹

????????一個二叉樹,如果每一個層的結點數都達到最大值,則這個二叉樹就是滿二叉樹。也就是說,如果一個二叉樹的層數為K,且結點總數是 ,則它就是滿二叉樹。如下圖:

d71c2e3bdfd340e0ba6b5231439169f4.png


?1.2 完全二叉樹

????????完全二叉樹是效率很高的數據結構,完全二叉樹是由滿二叉樹而引出來的。對于深度為K的,有n個結點的二叉樹,當且僅當其每一個結點都與深度為K的滿二叉樹中編號從1至n的結點一一對應時稱之為完全二叉樹。 要注意的是滿二叉樹是一種特殊的完全二叉樹。(直白點說就是:假設有n層,前n-1層為滿二叉樹,最后一層的節點從左到右依次連接,不會出現一個節點連不滿的情況)

如下圖:

e175d90e1297478dbc615a25111db280.png

????????這樣的它就不屬于完全二叉樹:

9540a312cedd427d8673daf70ff49cbf.png

?因為從左到右,有節點沒有滿(從左到右節點必須連滿,不能出現有空)。

1.3 二叉樹的性質

  1. ?若規定根節點的層數為1,則一棵非空二叉樹的第i層上最多有 2???1?個結點.
  2. ?若規定根節點的層數為1,則深度為h的二叉樹的最大結點數是2?-1
  3. ?對任何一棵二叉樹, 如果度為0其葉結點個數為 , 度為2的分支結點個數為 ,則有?n?=n?+1(下標為二叉樹的度)
  4. ?若規定根節點的層數為1,具有n個結點的滿二叉樹的深度,h= log?(n+1)

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

  • 若i>0,i位置節點的雙親序號:(i-1)/2;i=0,i為根節點編號,無雙親節點
  • ?若2i+1<n,左孩子序號:2i+1,2i+1>=n否則無左孩子
  • ?若2i+2<n,右孩子序號:2i+2,2i+2>=n否則無右孩子

2. 搜索二叉樹

? ? ? ? 上述的二叉樹對于數據存儲沒什么特別規定與要求,屬于普通二叉樹大類,對于普通二叉樹來說,沒有增刪查改,普通二叉樹的增刪查改在現實應用中是沒有意義的(數據沒有特殊規定,無法確認新增節點的位置)。所以這里我們再來介紹一下其他的二叉樹——搜索二叉樹

?????????什么是搜索二叉樹?如下圖:

20f39fc751d5462f94d438b0fc0604a6.png

?????????任何一顆樹,左子樹都要比根小,右子樹都要比根大。搜索二叉樹的這個特性使得它的插入位置就可以確定。例如我們要插入一個數據38:

46b403eb595040bcbdc900162ec07775.png

?????????從根開始,38比35大,就進入右子樹,38比39小,那就插入到39左子樹的位置。

例如我們再插入一個40:

8f87dae73c7945b5a266b2a48e1c0cf7.png

?????????從根開始,40比35大,就進入右子樹,40比39大,進入右子樹,40比65小,那就插入到65的左孩子節點位置。

????????如果我們要查找一個數,例如我們查找30,30比35小,進入左子樹,30比17大,進入右子樹,30比20大繼續進入到右子樹,但20沒有子節點,所以沒有30這個節點,到這里就停止尋找。通過這些例子我們可以發現,這樣的二叉樹很適合搜索。搜索二叉樹最多搜索高度次。

????????搜索的時間復雜度是O(N),細心的同學可能就會發現,搜素二叉樹最多搜素高度次,那二叉樹的高度不是有一個公式h= log?(n+1),時間復雜度為什么不是O(log N)?

? ? ? ? ?這里注意:這個二叉樹的高度公式針對的是滿二叉樹,而搜素二叉樹它可能出現退化的情況。如下圖:

8d3ee5a13daf44318153982b4966901e.png

?最壞的情況:我們找1這個節點,它的時間復雜度就是O(N)。

那要如何避免這種情況的發生?使左右兩邊的節點數量均勻,又要保持這個特性。

?這里又可以引出一個新的概念——平衡樹

?平衡樹的特性就是:左右兩邊的節點數據比較均勻。

?平衡樹又可以分為:

  • AVL樹
  • 紅黑樹

?????????依照現在博客所講的水平,想要學會這兩種樹是不可能的,除此之外后續我們還會學習B樹,它是一種多叉搜索樹。數據庫的原理就與它有關。(此部分為了解)這部分的樹狀結構才是有用的東西,精髓就在這部分內容,這里我們后續會進行學習。

????????本期我們不會進行代碼的編寫介紹,我們要弄清楚二叉樹的性質,以及延申部分。接下來就是練習部分,幫助大家理解掌握二叉樹的性質。

?3. 練習

📖?題目一

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

A、不存在這樣的二叉樹

B、200

C、198

D、199

?題目解析:

????????度為2的節點有199個,根據二叉樹的性質:n?=n?+1,度為0的節點個數等于度為2的節點個數+1。度為0的節點就為葉子節點。

?

正確答案:B

📖?題目二

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

B、n+1

C、n-1

D、n/2

?題目解析:

????????這道題目看似無解,突破口就在完全二叉樹。我們設度為0的節點個數為N0,度為1的節點個數為N1,度為2的節點個數為N2。根據性質可知:N0=N2+1,且N0+N1+N2=2n。

????????兩式聯合:N0+N1+N0-1=2n。

又因為這是一顆完全二叉樹,完全二叉樹度為1的節點只能有1個或沒有。但又要確保都為整數,所以度為1的節點就只要1個。即:N0+1+N0-1=2n

?

正確答案:A

📖?題目三?

3.一棵完全二叉樹的節點數位為531個,那么這棵樹的高度為( )

A、11

B、10

C、8

D、12

?題目解析:

????????題目要求這棵樹的高度,那就設樹的高度為h,最后一層缺了X個,根據定義我們可知:滿二叉樹是一種特殊的完全二叉樹。

? ? ? ? 由此可得出:2^h-1-X就是完全二叉樹的節點個數,即:2^h-1-X=531。到這里看似無解,但我們還可以根據性質進行推算,X的取值范圍是0? ~? 2^(h-1)-1,至少最后一層有1個節點,最多最后一次為滿(滿二叉樹),知道這些我們就可以帶選項進行推算了。代換:2^h-1-2^(h-1)+1。代入選項,看最終哪個選項的結果最接近500。

? ? ? ? 代入11,2的11次方:2048-1024=1024,如果高度是11那最少有1024個節點,A選項錯誤。這樣依次代入。

?

正確答案:B


總結

????????通過本篇博客我們對二叉樹的內在結構、特性,有了更全面的了解,希望通過本篇博客的閱讀,你已經掌握了深入理解二叉樹的關鍵知識。最后,感謝閱讀!

?

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

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

相關文章

Java中的異常

認識異常 異常就是程序出現的問題&#xff1b; Integer.valueOf("aaaa"); 異常體系 因為寫代碼時經常會出現問題&#xff0c;Java的設計者們早就為我們寫好了很多個異常類&#xff0c;來描述不同場景下的問題。而有些類是有共性的所以就有了異常的繼承體系 Error&…

日志采集分析ELK

這里的 ELK其實對應三種不同組件 1.ElasticSearch&#xff1a;基于Java&#xff0c;一個開源的分布式搜索引擎。 2.LogStash&#xff1a;基于Java&#xff0c;開源的用于收集&#xff0c;分析和存儲日志的工具。&#xff08;它和Beats有重疊的功能&#xff0c;Beats出現之后&a…

OLED透明屏采購指南:如何選擇高質量產品?

著科技的不斷進步&#xff0c;OLED透明屏作為一種創新的顯示技術&#xff0c;在各個行業中得到了廣泛應用。 在進行OLED透明屏采購時&#xff0c;選擇高質量的產品至關重要。在這篇文章中&#xff0c;尼伽將為您提供一個全面的OLED透明屏采購指南&#xff0c;幫助您了解關鍵步…

day20 飛機大戰射擊游戲

有飛行物類 飛行 爆炸 的連環畫&#xff0c; 飛行的背景圖 &#xff0c; 子彈圖&#xff0c; 還有游戲開始 暫停 結束 的畫面圖。 設計一個飛機大戰的小游戲&#xff0c; 玩家用鼠標操作hero飛行機&#xff0c; 射出子彈殺死敵機&#xff0c;小蜜蜂。 敵機可以獲得分數&…

Jmeter參數化類型

1.參數在多個請求報文中出現&#xff0c;執行一次需要使用同一個參數--隨機生成(隨機變更) 2.參數在請求報文中出現&#xff0c;執行過程需要使用同一個參數(--固定參數) 3.參數從指定幾個固定中隨機獲取一個 4.參數從本地文件中獲取 5.參數在多個請求報文中出現&#xff0c;每…

c++11:std::partition分割,std::is_partitioned判斷

序列 vec.clear();for(int i 0;i<10;i){vec.push_back(i);}重新分割。大于1的排在后&#xff0c;返回第一個 std::vector<int>::iterator it std::partition(vec.begin(),vec.end(),[](int value){return value>1;}); std::cout<<"partition:"&l…

計算機 數進制轉換;存儲MB與帶寬Mbps

參考&#xff1a;https://zhuanlan.zhihu.com/p/459817484 1、計算機 數進制轉換 1&#xff09;與十進制相關的轉換 2&#xff09;與二進制相關的轉換 二進制是Binary&#xff0c;簡寫為B&#xff1b;八進制是Octal&#xff0c;簡寫為O&#xff1b;十進制是Decimal&#xff…

centos nginx配置ipv4和ipv6的地址都可以訪問同一個網站

標題centos nginx配置ipv4和ipv6的地址都可以訪問同一個網站 在 Nginx 中配置使 IPv4 和 IPv6 地址都可以訪問同一個網站相對簡單。只需要確保 Nginx 配置文件正確地配置了監聽 IPv4 和 IPv6 地址的監聽器即可。 打開你的 Nginx 配置文件&#xff0c;通常位于 /etc/nginx/nginx…

還在玩傳統終端,不妨來試試全新 AI 終端 Warp

壹 ? 引 最近一段時間&#xff0c;AI領域如同雨后春筍般開始猛烈生長&#xff0c;processon&#xff0c;sentry&#xff0c;一些日常使用的工具都在積極接入AI&#xff0c;那么正好借著AI的風頭&#xff0c;今天給大家推薦一款非常不錯的智能終端 warp&#xff08;目前僅限ma…

車載APP軟件外包開發通訊

車載APP與車輛之間的通信方式和特點會因為不同的技術和場景而有所不同。以下是一些常見的車載APP與車輛通信方式以及它們的特點&#xff0c;希望對大家有所幫助。北京木奇移動技術有限公司&#xff0c;專業的軟件外包開發公司&#xff0c;歡迎交流合作。 1.藍牙連接&#xff1a…

英語——基本句型

第一節 句型1——主語+謂語 一個句子為了說明一件事或表達一種感情,最簡單的表達方式,就是“誰,怎么了”。這里的“誰”,就是句子的主語,它的內涵很豐富,可以是人、物、某種行為等。“怎么了”,就是句子的謂語,一般由不及物動詞充當。主語+謂語,即構成一個最簡單的句…

STM32 F103C8T6學習筆記9:0.96寸單色OLED顯示屏—自由取模顯示—顯示漢字與圖片

今日學習0.96寸單色OLED顯示屏的自由取模顯示: 宋體漢字比較復雜&#xff0c;常用字符可以直接復制存下來&#xff0c;畢竟只有那么幾十個字母字符&#xff0c;但漢字實在太多了&#xff0c;基本不會全部放在單片機里存著&#xff0c;一般用到多少個字就取幾個字的模&#xff…

基于STM32+微信小程序設計的寵物投喂裝置(騰訊云IOT)

一、設計需求 【1】 項目背景 社會經濟的飛速發展與城市化進程的加速,城市市民家庭的封閉化和人口老齡化的情況日益突出,基于人們的情感寄托與休閑消費的需要,中國的寵物產業也悄然興起。家庭寵物的飼養成為了城市居民生活消遣的新方式。寵物的喂養和看護往往是寵物主人最…

hive高頻使用的拼接函數及“避坑”

hive高頻使用的拼接函數及“避坑” 說到拼接函數應用場景和使用頻次還是非常高&#xff0c;比如一個員工在公司充當多個角色&#xff0c;我們在底層存數的時候往往是多行&#xff0c;但是應用的時候我們通常會只需要一行&#xff0c;角色字段進行拼接&#xff0c;這樣join其他…

typescript基礎之null和undefined

TypeScript是一種基于JavaScript的編程語言&#xff0c;它支持靜態類型檢查和面向對象的特性。TypeScript中的null和undefined是兩種基本類型&#xff0c;它們分別表示空值或未定義的值。在本文中&#xff0c;我將介紹TypeScript中null和undefined的含義、區別、檢查方法和使用…

Transformer 相關模型的參數量計算

如何計算Transformer 相關模型的參數量呢&#xff1f; 先回憶一下Transformer模型論文《Attention is all your need》中的兩個圖。 設Transformer模型的層數為N&#xff0c;每個Transformer層主要由self-attention 和 Feed Forward組成。設self-attention模塊的head個數為 …

linux系統部署jenkins詳細教程

一、Linux環境 1、下載war包 官網下載地址&#xff1a; https://get.jenkins.io/war-stable/2.332.4/jenkins.war 2、將war包上傳至服務器 創建目錄/home/ubuntu/jenkins 上傳war包至該目錄 3、將jenkins添加到環境變量 進入環境變量文件 vim /etc/profile # 文件下方追加…

【3Ds Max】圖形合并命令的簡單使用

示例&#xff08;將文字設置在球體上&#xff09; 1. 首先這里創建一個球體和一個文本 2. 選中球體&#xff0c;在復合對象中點擊圖形合并按鈕 點擊“拾取圖形”按鈕&#xff0c;然后選中文本&#xff0c;此時可以看到球體上已經投射出文本 3. 接下來是一些常用參數的介紹 當…

從零實戰SLAM-第八課(非特征點的視覺里程計)

在七月算法報的班&#xff0c;老師講的蠻好。好記性不如爛筆頭&#xff0c;關鍵內容還是記錄一下吧&#xff0c;課程入口&#xff0c;感興趣的同學可以學習一下。 --------------------------------------------------------------------------------------------------------…

centos下使用jemalloc解決Mysql內存泄漏問題

參考&#xff1a; MySQL bug&#xff1a;https://bugs.mysql.com/bug.php?id83047&tdsourcetags_pcqq_aiomsg https://github.com/jemalloc/jemalloc/blob/dev/INSTALL.md &#xff08;1&#xff09;ptmalloc 是glibc的內存分配管理 &#xff08;2&#xff09;tcmalloc…