NO.6數據結構樹|二叉樹|滿二叉樹|完全二叉樹|順序存儲|鏈式存儲|先序|中序|后序|層序遍歷

![[Pasted image 20250716133753.png]]

樹與二叉樹的基本知識

樹的術語

![[Pasted image 20250716133819.png]]

  1. 結點: 樹中的每個元素都稱為結點, 例如上圖中的 A,B,C…
  2. 根結點: 位于樹頂部的結點, 它沒有父結點,比如 A 結點。
  3. 父結點: 若一個結點有子結點, 那么這個結點就稱為其子結點的父結點。
    例如 A 是 B,C,D 的父節點。
  4. 子結點: 一個結點含有的子樹的根結點稱為該結點的子結點。
    例如 B,C,D 是 A 的子節點。
  5. 兄弟結點: 具有相同父結點的結點互稱為兄弟結點。
    例如 B,C,D 結點互為兄弟結點。
  6. 葉子結點: 沒有子節點的節點, 例如 B,D,F,G,H 結點。
  7. 結點的層次: 從根開始定義起, 根為第 1 層, 根的子結點為第 2 層, 以此類推。
  8. 樹的深度(高度) : 樹中結點的最大層次, 右圖中的樹的深度為 4。
  9. 結點的度: 一個結點含有的子樹的個數稱為該結點的度。
  10. 樹的度: 一棵樹中, 最大的結點的度稱為樹的度,右圖中的樹的度為 3。
  11. 子孫: 以某結點為根的子樹中任一結點都稱為該結點的子孫。
  12. 森林: 由 n(n>=0)棵互不相交的樹的集合稱為森林。

高度為h的m叉樹和高度為h,度為m的樹有什么區別?

  1. 度為m的樹中,必須至少有一個結點有m個孩子結點
  2. m叉樹中可以沒有一個結點的孩子數等于m,甚至可以是一棵空樹。
樹的性質:
  1. 樹中的結點數等于所有結點的度數加1.
  2. 度為m的樹中第i層上至多有m^{i-1}個結點.
  3. 高度為h的m叉樹至多有(m^{h} - 1) / (m - 1)個結點
  4. 具有n個結點的m叉樹的最小高度為ceil(log_{m}(n(m-1)+1))
二叉樹的基本概念

二叉樹中每個節點的度數均不超過 2。
![[Pasted image 20250716133940.png]]

二叉樹和度為2的有序樹有什么區別?

  1. 度為2的樹至少有3個結點,二叉樹可以為空。
  2. 度為2的有序樹的孩子結點的左右次序是相對而言的,
    若某個結點只有一個孩子,則這個孩子就不存在左右這個概念。
    二叉樹無論有沒有2個孩子,均需要區分左右孩子結點。
滿二叉樹

![[Pasted image 20250716135636.png]]

性質:

  1. 高為 h 的滿二叉樹上一共有 2^h -1 個結點。
  2. 高為 h 的滿二叉樹上, 每層都有 2^{h-1}個結點。
  3. 高為 h 的滿二叉樹上, 所有的葉子結點都在最后一層。
  4. 高為 h 的滿二叉樹上, 除葉子結點外, 每個結點的度都為 2.
  5. 高為 h 的滿二叉樹上, 對每個結點從上到下, 從左到右進行編號(從 1 開始), 對于任意編號 i, 若有雙親, 則其雙親結點的編號一定是 floor(i/2), 若有孩子結點, 則左孩子編號為 2i, 右孩子編號為 2i+1.
完全二叉樹

![[Pasted image 20250716135725.png]]

性質:

  1. 高為 h, 有 n 個結點的完全二叉樹上, 編號與滿二叉樹的一一對應。
  2. 高為 h, 有 n 個結點的完全二叉樹上, 若結點編號 i>floor(n/2), 則該結點一定是葉子結點, 否則是非葉子結點。
  3. 高為 h, 有 n 個結點的完全二叉樹上, 葉子結點只會處于最后一層和倒數第二層。
  4. 高為 h, 有 n 個結點的完全二叉樹上, 只可能存在一個結點度為 1 并且它肯定只有左孩子沒有右孩子。
  5. 高為 h, 有 n 個結點的完全二叉樹上, 若 n 為奇數則所有結點度都為 2, 若為偶數,則有一個結點度為 1。
  6. 具有 n 個(n>0)結點的完全二叉樹的高度為 ceil(log_{2} (n+1))或 floor(log_{2} n)+1

6.證明:設完全二叉樹的高度為h,則有
2^{h-1}-1 (高度為h-1的滿二叉樹)<n≤2^{h} -1(高度為h的滿二叉樹)
或 2^{h-1}≤n < 2^h 得 2^{h-1}<n+1 ≤ 2^h ,
即 h-1<log_{2}(n+1)≤h,
故 h= ceil(log_{2} (n+1))
或得 h-1 ≤log_{2}(n)<h,
故 h=floor(log_{2} n)+1

二叉樹的性質
  1. 樹中的結點數等于所有結點的度數加1
  2. 二叉樹第 k 層上的結點數目最多為 2k-1。 (k≥1)
  3. 深度為 k 的二叉樹至多有 2k -1 個結點。 (k≥1)
  4. 包含 n 個結點的二叉樹的高度至少為 log2(n+1)。
  5. 在任意一棵二叉樹中, 若葉子結點的個數為 n0, 度為 2 的結點數為 n2, 則 n0=n2+1 。
    證明: 結點總數為 n0+n1+n2,有 n0+n1+n2 = n1+2n2+1 化簡得 n0=n2+1
二叉樹的存儲結構
順序存儲結構

![[Pasted image 20250716140135.png]]

事實一:所有完全二叉樹前k個結點的形狀結構完全相同
![[Pasted image 20250716140149.png]]

事實二:完全二叉樹中結點編號與其位置一對應
![[Pasted image 20250716140213.png]]

注: 數組編號應從 1 開始, 不然無法滿足前面所述的二叉樹節點編號之間的關系, 無法做到隨機訪問。 此方法也是后面堆排序的基礎。

鏈式存儲結構

數據結構定義

typedef struct BiTNode{Elemtypedata;struct BiTNode *Ichild, *rchild;
}BiTNode;typedef struct BiTreeBiTNode *root;
}BiTree;

注: 一棵含有 n 個結點的二叉樹采用鏈式存儲結構時, 有 n+1 個指針處于閑置狀態, 也就是沒有高效利用內存

二叉樹的遍歷

設解決某個遞歸問題的時間為T(N)其中處理一半問題的時間為T(N/2)
設其他處理的時間為O(N)
T(N) = 2*T(N/2) +c*N
則有T(N/2)= 2*T(N/4)+c*N/2
代入得T(N) = 2*(2*T(N/4)+c*N/2)+c*N
以此類推,
T(N) = 2^k* T(N/2^k)+ k*c*N
N/2^k=1時,(N=2^k,k=log_{2}N 則有T(N)= 2^{k}*O(1)+k*c*N =N*O(1) + logN*c*N
O(nlogn)

以 A 為根節點的二叉樹可以在左子樹上遞歸劃分
![[Pasted image 20250716140505.png]]

先序遍歷
  1. 訪問根節點
  2. 先序遍歷左子樹
  3. 先序遍歷右子樹
void PreOrder(BiTree T){//先序遞歸遍歷if(T != Null){ visit(T);PreOrder(T->lchild);PreOrder(T->rchild);}
}
中序遍歷
  1. 中序遍歷左子樹
  2. 訪問根節點
  3. 中序遍歷右子樹
void InOrder(BiTreeT) //中序遞歸遍歷if(T != Null){InOrder(T->lchild); visit(T); InOrder(T->rchild);}
}

中序遞歸遍歷時,當訪問到某結點時,其他結點的狀態?
當訪問到任意結點時,都代表以該結點為根的左子樹已經遍歷完成并且都退出了棧;
若該結點是其雙親結點的左孩子,則它的雙親結點此時還沒有被訪問且在棧中;
若該結點是其雙親結點的右孩子,那么此時其雙親結點已經被訪問過并且出棧了。

注:對于系統棧來說,中序遍歷時,左右子樹都訪問完才會出棧雙親結點,而非遞歸遍歷時用戶自己申請的棧一般是雙親結點出棧后才訪問的右子樹(具體代碼可能有不同的實現)

后序遍歷
  1. 后序訪問左子樹
  2. 后序訪問右子樹
  3. 訪問根節點
void PostOrder(BiTree T) //后序遞歸遍歷if(T != Null){PostOrder(T->lchild);PostOrder(T->rchild); visit(T);}
}

后序遞歸遍歷時,當訪問到某結點時,其他結點的狀態?
若該結點是其雙親結點的左孩子,此時其雙親結點都沒有被訪問到并且還在棧中。而且該結點的所有祖先結點也保存在棧中。
若該結點是其雙親結點的右孩子,此時其雙親結點都沒有被訪問到并且還在棧中。而且該結點的所有祖先結點也保存在棧中。
當訪問到任意結點時,都代表以該結點為根的子樹已經全部遍歷完成并且都退出了棧,不會再訪問到。
不管該結點是其雙親結點的左孩子還是右孩子,此時其雙親結點都沒有被訪問到并且還在棧中。而且該結點的所有祖先結點也保存在棧中。

層序遍歷

從上至上、 從左至右依次訪問樹中的每個節點

void LevelOrder(BiTree T) //層序遍歷InitQueue(Q);//聲明隊列BiTree p; //聲明工作結點EnQueue(Q, T);//根結點入隊while(!isEmpty(Q)){//遍歷整棵樹 DeQueue(Q,p);//出隊visit(p); //訪問當前結點if(p->lchild != Null{ //左孩子入隊EnQueue(Q, p->lchild);} if(p->rchild != Null{ //右孩子入隊 EnQueue(Q, p->rchild);}}
}

若想要從下到上, 從右到左(也就是層序遍歷逆序列)的遍歷一棵二叉樹, 只需要在層序遍歷的基礎上再借助一個棧即可實現。

例題

先序序列為 abcd 的不同二叉樹的個數為( )B
A.13 B.14
C.15 D.16
![[Pasted image 20250716142759.png]]

![[Pasted image 20250716142841.png]]

f(4) = 2f(3)+2(f(1)× f(2))
![[Pasted image 20250716143050.png]]

f(3) = 2f(2) + f(1)× f(1)
![[Pasted image 20250716143106.png]]

f(2) = f(1) + f(1) = 2
f(3) = 2f(2) + f(1)× f(1) = 5
f(4) = 2f(3)+2(f(1)× f(2)) = 10+4 = 14

思考: 先序序列為1,2,3,…,n的二叉樹一共有多少種不同的形狀?
f(4) = 2f(3)+2(f(1)× f(2))
= f(3)× f(0) + f(2)× f(1) + f(1)× f(2) + f(0)× f(3), (f(0)=1)

f(n) = f(n-1)× f(0) + f(n-2)× f(1)+… + f(1)× f(n-2) + f(0)× f(n-1), (f(0)=1)

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

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

相關文章

數據集下載網站

名稱簡介鏈接Kaggle世界上最大的數據科學競賽平臺之一&#xff0c;有大量結構化、圖像、文本等數據集可直接下載?支持一鍵下載、APIPapers with Code可按任務&#xff08;如圖像分類、文本生成等&#xff09;查找模型與數據集&#xff0c;標注 SOTA?與論文強關聯Hugging Face…

Tomcat 生產 40 條軍規:容量規劃、調優、故障演練與安全加固

&#xff08;一&#xff09;容量規劃 6 條 軍規 1&#xff1a;線程池公式 maxThreads ((并發峰值 平均 RT) / 1000) 冗余 20 %&#xff1b; 踩坑&#xff1a;壓測 2000 QPS、RT 200 ms&#xff0c;理論 maxThreads500&#xff0c;線上卻設 150 導致排隊。軍規 2&#xff1a;…

深入解析 Amazon Q:AWS 推出的企業級生成式 AI 助手

在人工智能助手競爭激烈的當下&#xff0c;AWS 重磅推出的 Amazon Q 憑借其強大的企業級整合能力&#xff0c;正成為開發者提升生產力的新利器。隨著生成式 AI 技術席卷全球&#xff0c;各大云廠商紛紛布局智能助手領域。在 2023 年 re:Invent 大會上&#xff0c;AWS 正式推出了…

物流自動化WMS和WCS技術文檔

導語大家好&#xff0c;我是社長&#xff0c;老K。專注分享智能制造和智能倉儲物流等內容。歡迎大家使用我們的倉儲物流技術AI智能體。新書《智能物流系統構成與技術實踐》新書《智能倉儲項目出海-英語手冊&#xff0c;必備&#xff01;》完整版文件和更多學習資料&#xff0c;…

Web3.0 實戰項目、簡歷打造、精準投遞+面試準備

目錄 一、獲取真實企業級 Web3.0 項目的 5 種方式 1. 參與開源項目&#xff08;推薦指數&#xff1a;?????&#xff09; 2. 參與黑客松&#xff08;Hackathon&#xff09; 3. 遠程實習 & DAO 協作項目&#xff08;兼職也可&#xff09; 4. Web3 Startup 實戰項目合…

pymongo庫:簡易方式存取數據

文檔 基礎使用 前提&#xff1a;開發機器已安裝mongo配置環境&#xff0c;已啟動服務。 macOS啟動服務&#xff1a;brew services start mongodb-community8.0 macOS停止服務&#xff1a;brew services stop mongodb-community8.0安裝&#xff1a;python3 -m pip install pym…

Java 線程池與多線程并發編程實戰全解析:從異步任務調度到設計模式落地,200 + 核心技巧、避坑指南與業務場景結合

多線程編程在現代軟件開發中扮演著至關重要的角色&#xff0c;它能夠顯著提升應用程序的性能和響應能力。通過合理利用異步線程、多線程以及線程池等技術&#xff0c;我們可以更高效地處理復雜任務&#xff0c;優化系統資源的使用。同時&#xff0c;在實際應用中&#xff0c;我…

gitee 分支切換

ssh-keygen -t rsa -C "pengchengzhangcplaser.com.cn" ssh -T gitgitee.comgit remote add origin 倉庫地址git config --global user.email "youexample.com"git config --global user.name "Your Name"# 1. 更新遠程信息 git fetch origin# …

Vue3生命周期函數

在 Vue 3 中&#xff0c;生命周期鉤子函數是指組件從創建到銷毀的整個過程中&#xff0c;Vue 自動調用的一些特定函數。它們讓你能夠在組件的不同階段執行一些自定義操作。Vue 3 提供了組合式 API 和選項式 API 兩種方式來定義生命周期鉤子。1. onBeforeMount (組合式 API)作用…

基于SEP3203微處理器的嵌入式最小硬件系統設計

目錄 1 引言 2 嵌入式最小硬件系統 3 SEP3202簡述 4 最小系統硬件的選擇和單元電路的設計 4.1 電源電路 4.2 晶振電路 4.3 復位及喚醒電路 4.5 存儲器 4.5.1 FLASH存儲 4.5.2 SDRAM 4.6 串行接口電路設計 4.7 JTAG模塊 4.8 擴展功能&#xff08;LED&#xff09; …

【開源軟件推薦】 SmartSub,一個可以快速識別視頻/音頻字幕的工具

背景介紹 我就說Github上面能找到好東西吧 事情是這樣的 我最近在用PC端的剪映剪輯視頻 需要用到它的語音轉字幕功能 轉完之后&#xff0c;導出的時候 發現 赫然有一項字幕識別的會員權益 我尋思看看什么價格 不貴的話就充了 好家伙&#xff0c;這不看不知道&#xff…

自動駕駛仿真領域常見開源工具

自動駕駛仿真領域常見開源工具1、目錄1.1 自動駕駛仿真領域常見開源2、地圖&場景2.1、場景播放器-Esmini4、被測對象-智駕軟件4.1、Autoware4.4、端到端模型-VAD4.5、端到端模型-UniAD4.6、端到端模型-ThinkTwice4.7、端到端模型-TCP5、評價方法5.1、Leaderboard5.2、Bench…

GPU算力租用平臺推薦,價格便宜且有羊毛薅,最低只要0.49/小時!

1.趨動云&#xff0c;這是我近期一直在用的&#xff0c;使用體驗還不錯&#xff0c;推薦給大家 網址&#xff1a;https://platform.virtaicloud.com/gemini_web/auth/register?inviteCode5f74065eac6d8867eac5c82194e2683a 是否選擇一個算力平臺我認為有幾點需要考慮&#xff…

python學智能算法(二十五)|SVM-拉格朗日乘數法理解

引言 前序學習進程中&#xff0c;已經對最佳超平面的求解有了一定認識。 剛好在此梳理一下: 函數距離 首先有函數距離F&#xff0c;也可以稱為函數間隔F&#xff1a; Fmin?i1...myi(w?xib)F \min_{i1...m}y_{i}(w \cdot x_{i}b)Fi1...mmin?yi?(w?xi?b) 幾何距離 然后…

vscode 源碼編譯

windows 環境 下載安裝 build tools Visual Studio Build Tools 勾選 C 因為安裝詳細信息里是 v143&#xff0c;所以單個組件里也要追加兩個 143 的勾選 點擊安裝&#xff0c;安裝好重啟下電腦 Electron 安裝失敗&#xff1a;connect ETIMEDOUT 20.205.243.166:443 為防Ele…

讀取和寫入json,xml文件

一、JSON文件操作? 1. 核心類?? ??QJsonDocument??&#xff1a;表示整個JSON文檔&#xff0c;提供解析&#xff08;fromJson()&#xff09;和序列化&#xff08;toJson()&#xff09;功能。 ??QJsonObject??&#xff1a;存儲鍵值對集合&#xff0c;支持嵌套對象和數…

深度學習×第10卷:她用一塊小濾鏡,在圖像中找到你

&#x1f308;【第一節 她看到的是像素點&#xff0c;卻試圖拼出你整張臉】&#x1f4f8; 圖像是什么&#xff1f;她從未見過你&#xff0c;但看見的是你的一片光斑圖像&#xff0c;在神經網絡的眼里&#xff0c;是一個個數字格子。這些格子&#xff0c;每個都有 0~255 的亮度…

計算機組成原理中的RAM:核心技術深度解析

摘要&#xff1a;本文深度剖析RAM在計算機體系中的核心地位&#xff0c;結合2025年最新技術標準與實測數據&#xff0c;涵蓋DRAM工作原理、主流技術對比、非易失性存儲革新及未來發展趨勢&#xff0c;為硬件開發者和系統架構師提供權威技術參考。一、RAM基礎原理與系統交互機制…

C語言—深入理解指針(詳)

深入理解指針&#xff08;詳解&#xff09;前言一、指針是什么1、指針的定義2、指針的大小二、指針類型1、類型2、不同類型的意義三、野指針1、野指針形成原因2、如何避免野指針四、指針的運算1、 指針整數2、指針-指針3、指針的關系運算五、const修飾指針1、consr修飾變量2、c…

小談相機的學習過程

前言博主本人并非專職相機開發&#xff0c;還涉及系統的其他幾個模塊&#xff0c;雖然都屬于owner&#xff0c;但是都還在學習探索的一個過程&#xff0c;自認為掌握還不夠細致&#xff0c;此篇文章僅梳理&#xff0c;總結&#xff0c;印證自己近五年相機模塊的一個學習過程&am…