數據結構基礎--------【二叉樹基礎】

二叉樹基礎

二叉樹是一種常見的數據結構,由節點組成,每個節點最多有兩個子節點,左子節點和右子節點。二叉樹可以用來表示許多實際問題,如計算機程序中的表達式、組織結構等。以下是一些二叉樹的概念:

  1. 二叉樹的深度:從根節點到葉子節點的最長路徑的長度稱為二叉樹的深度,也稱為高度。
  2. 二叉樹的度:一個節點擁有的子節點數量稱為該節點的度。二叉樹的度為2,即每個節點最多只有兩個子節點。
  3. 二叉樹的遍歷:二叉樹的遍歷是指按照一定順序訪問樹中的所有節點。常用的遍歷方式有前序遍歷、中序遍歷和后序遍歷。
  4. 二叉查找樹:二叉查找樹是一種特殊的二叉樹,它的左子樹中所有節點的值都小于根節點的值,而右子樹中所有節點的值都大于根節點的值。

二叉樹的定義:

	struct TreeNode{int val;TreeNode* left;TreeNode* right;TreeNode(int x):val(x),left(nullptr),right(nullptr) {}}
  1. 二叉樹的基本操作:包括二叉樹的創建、遍歷、搜索等。
  2. 二叉查找樹的實現及應用:包括二叉查找樹的創建、插入、刪除、查找等操作。
  3. 平衡二叉樹:為了解決二叉查找樹在某些情況下退化為鏈表的問題,出現了平衡二叉樹,如 AVL 樹和紅黑樹等。
  4. 線段樹:線段樹是一種特殊的二叉樹,用于解決區間查詢的問題,如區間最大值、區間和等。
  5. 樹狀數組:樹狀數組也是一種特殊的二叉樹,用于解決前綴和、區間和等問題。

1基礎介紹

1.基礎術語

結點的度:結點的字數個數,比如二叉樹的度為2(一個節點最多有2個字數個數)。
樹的度:數的所有結點中最大的度數。
葉結點:度為0的結點。
父結點,子結點,兄弟結點(具有同一個父結點的各結點)。
路徑和路徑的長度:從結點n1到nk,路徑所包含的邊的個數為路徑的長度。
祖先結點,子孫結點。
結點的層次:規定根結點在1層,然后后面的結點層次都依次加一。
樹的深度:樹中國所有結點的最大層次是這棵樹的深度。
二叉樹T:一個有窮的結點集合,二叉樹的子樹有左右順序之分

2.二叉樹的定義

二叉樹T:一個有窮的結點集合,二叉樹的子樹有左右順序之分
特殊的二叉樹:斜二叉樹,滿二叉樹,完全二叉樹(連續結點)

3.二叉樹的性質

①個二叉樹第i層的最大結點數為: 2^(i-1),(i≥1)
②深度為k的二叉樹有最大結點總數為:(2^k)-1, k≥1。(1+2 ^1+2 ^2 …2 ^i )
③0對任何非空二叉樹T,若n0表示葉結點的個數、n2是度為2的非葉結點個數,那么兩者滿足關系n0=n2 +1。
(n0+n1+n2-1) = 0n0+n1+2n2

4.二叉樹的遍歷

根據遍歷結點的順序,分為前序遍歷(NLR),中序遍歷(LNR),后續遍歷(LRN)。樹的遍歷復雜度為o(n)。
所以看樹的前序數組第一個是根結點,后續遍歷數組最后一個是根結點,再把該根結點拿到中序遍歷數組中去比對就可以劃分左右子樹。

4.1 前序遍歷

如果二叉樹為空,什么都不做,否則:
1)訪問根節點;
2)先序遍歷左子樹
3)先序遍歷右子樹*/
void PreOrder(BiTree T){if(T!= null){vist(T);//訪問根結點NPreOrder(T->lchild);//訪問左子樹L 遞歸PreOrder(T->rchild);//訪問右子樹R}
}

![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/9bb1889a4e194ea79a4cddeafc8109fc.png = 200x200)

4.2 中序遍歷

/*inorder:
如果二叉樹為空,什么都不做,否則:
1)中遍歷左子樹
2)訪問根節點;
3)中序遍歷右子樹*/
void InOrder(BiTree T){if(T!= null){InOrder(T->lchild);//訪問左子樹L 遞歸vist(T);//訪問根結點NInOrder(T->rchild);//訪問右子樹R}
}

在這里插入圖片描述
4.3 后序遍歷

/*Postorder:
如果二叉樹為空,什么都不做,否則:
1)后序遍歷左子樹
2)后序遍歷右子樹
3)訪問根節點;*/void PostOrder(BiTree T){if(T!= null){PostOrder(T->lchild);//訪問左子樹L 遞歸PostOrder(T->rchild);//訪問右子樹Rvist(T);//訪問根結點N}
}

在這里插入圖片描述

4.4層序遍歷

2.遍歷基礎

1.DFS(Depth First Search):遞歸法得到最終的數組(深度優先算法)

其過程簡要來說是對每一個可能的分支路徑深入到不能再深入為止,如果遇到死路就往回退,回退過程中如果遇到沒探索過的支路,就進入該支路繼續深入,每個節點只能訪問一次。

深度優先搜索應用:先序遍歷,中序遍歷,后序遍歷。二叉樹的前序、中序、后序遍歷,本質上可以認為是深度優先遍歷。是一種回溯思想。

2.BFS(Breadth First Search):迭代法實現層序遍歷,每次遍歷二叉樹的某一層。
它并不考慮結果的可能位置,徹底地搜索整張圖,直到找到結果為止。基本過程,BFS是從根節點開始,沿著樹(圖)的寬度遍歷樹(圖)的節點。如果所有節點均被訪問,則算法中止。一般用隊列數據結構來輔助實現算法。

廣度優先搜索應用:層序遍歷、最短路徑、求二叉樹的最大高度、由點到面遍歷圖、拓撲排序

在我們解題過程中二叉樹有兩種主要的形式:滿二叉樹和完全二叉樹。

二叉樹分類

滿二叉樹

如果一棵二叉樹只有度為0的結點和度為2的結點,并且度為0的結點在同一層上,則這棵二叉樹為滿二叉樹。
如圖所示:
在這里插入圖片描述
這棵二叉樹為滿二叉樹,也可以說深度為k,有2^k-1個節點的二叉樹。

完全二叉樹

在完全二叉樹中,除了最底層節點可能沒填滿外,其余每層節點數都達到最大值,并且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 h 層(h從1開始),則該層包含 1~ 2^(h-1) 個節點。(連續)
在這里插入圖片描述

平衡二叉搜索樹

平衡二叉搜索樹:又被稱為AVL(Adelson-Velsky and Landis)樹,且具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,并且左右兩個子樹都是一棵平衡二叉樹。

如圖:
在這里插入圖片描述
最后一棵 不是平衡二叉樹,因為它的左右兩個子樹的高度差的絕對值超過了1。

二叉搜索樹

前面介紹的樹,都不用管數值的,而二叉搜索樹是要參考數值的,二叉搜索樹是一個有序樹。
若它的左子樹不空,則左子樹上所有結點的值均小于它的根結點的值;
若它的右子樹不空,則右子樹上所有結點的值均大于它的根結點的值;
它的左、右子樹也分別為二叉排序樹
下面這兩棵樹都是搜索樹:
在這里插入圖片描述
二叉搜索樹中序遍歷是從小到大的有序數組。

C++中map、set、multimap,multiset的底層實現都是平衡二叉搜索樹,所以map、set的增刪操作時間時間復雜度是logn,注意我這里沒有說unordered_map、unordered_set,unordered_map、unordered_set底層實現是哈希表。

(文章部分參考代碼隨想錄,鏈接: link

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

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

相關文章

Element-UI - el-table中自定義圖片懸浮彈框 - 位置優化

該篇為前一篇“Element-UI - 解決el-table中圖片懸浮被遮擋問題”的優化升級部分,解決當圖片位于頁面底部時,顯示不全問題優化。 Vue.directive鉤子函數已在上一篇中詳細介紹,不清楚的朋友可以翻看上一篇, “Element-UI - 解決el-…

深入刨析Redis存儲技術設計藝術(二)

三、Redis主存儲 3.1、存儲相關結構體 redisServer:服務器 server.h struct redisServer { /* General */ pid_t pid; /* Main process pid. */ pthread_t main_thread_id; /* Main thread id */ char *configfile; /* Absolut…

Interpretability 與 Explainability 機器學習

「AI秘籍」系列課程: 人工智能應用數學基礎人工智能Python基礎人工智能基礎核心知識人工智能BI核心知識人工智能CV核心知識 Interpretability 模型和 Explainability 模型之間的區別以及為什么它可能不那么重要 當你第一次深入可解釋機器學習領域時,你會…

Zabbix配置文件中Server和ServerActive參數講解

目錄 參數總結 實例: Zabbix Server 配置 (zabbix_server.conf) Zabbix Agent 配置 (zabbix_agentd.conf) 配置文件解析 實際應用 Zabbix Server 配置文件 (zabbix_server.conf) 對代理端的影響 1. Server 參數 2. ServerActive 參數 Zabbix Agent 配置文…

ubuntu 22 安裝 lua 環境 編譯lua cjson 模塊

在 windows 下使用 cygwin 編譯 lua 和 cjson 簡直就是災難,最后還是到 ubuntu 下完成了。 1、下載lua源碼(我下載的 5.1 版本,后面還有一個小插曲), 直接解壓編譯,遇到一個 readline.h not found 的問題,需要安裝 re…

python使用langchain整合通義千文

首先pip安裝langchain和dashscope pip install langchain pip install langchain_community pip install dashscope --upgrade然后測試一下運行效果 from langchain_community.chat_models.tongyi import ChatTongyi from langchain.schema import HumanMessage #api_key可以…

如何使用C++中的內聯函數和編譯器優化

在C中,內聯函數(inline functions)是一種請求編譯器嘗試在調用點將函數體展開,而不是按照常規函數調用的方式(即產生調用指令、保存寄存器、棧幀操作等)來執行的特殊函數。內聯函數主要用于小的、頻繁調用的…

CentOS命令格式及常用命令

在CentOS中,系統目錄結構遵循了標準的Linux文件系統層次結構(Filesystem Hierarchy Standard,FHS)。下面是CentOS系統中一些重要的目錄及其用途的介紹: 1. /(根目錄):整個文件系統的…

207 課程表

題目 你這個學期必須選修 numCourses 門課程,記為 0 到 numCourses - 1 。 在選修某些課程之前需要一些先修課程。 先修課程按數組 prerequisites 給出,其中 prerequisites[i] [ai, bi] ,表示如果要學習課程 ai 則 必須 先學習課程 bi 。 …

ArcGIS Pro SDK (七)編輯 13 注解

ArcGIS Pro SDK (七)編輯 13 注解 文章目錄 ArcGIS Pro SDK (七)編輯 13 注解1 注釋構建工具2 以編程方式啟動編輯批注3 更新批注文本4 修改批注形狀5 修改批注文本圖形6 接地到網格 環境:Visual Studio 2022 .NET6 …

在 PostgreSQL 中,如何處理數據的版本控制?

文章目錄 一、使用時間戳字段進行版本控制二、使用版本號字段進行版本控制三、使用歷史表進行版本控制四、使用 RETURNING 子句獲取更新前后的版本五、使用數據庫觸發器進行版本控制 在 PostgreSQL 中,處理數據的版本控制可以通過多種方式實現,每種方式都…

ensorFlow是由Google開發的

TensorFlow是由Google開發的一個開源的深度學習框架。它提供了一種靈活且高效的方法來構建、訓練和部署各種機器學習模型。 TensorFlow的基本概念是計算圖(computational graph)。在TensorFlow中,用戶通過定義計算圖來描述模型的結構和計算流…

JVM(Java虛擬機)詳解(JVM 內存模型、堆、GC、直接內存、性能調優)

JVM(Java虛擬機) JVM 內存模型 結構圖 jdk1.8 結構圖(極簡) jdk1.8 結構圖(簡單) JVM(Java虛擬機): 是一個抽象的計算模型。如同一臺真實的機器,它有自己…

思維導圖插件--jsMind的使用

vue引入jsmind(右鍵菜單)_jsmind.menu.js-CSDN博客 第一版 vue-JsMind思維導圖實現(包含鼠標右鍵自定義菜單)_jsmind 右鍵菜單-CSDN博客 // 新增節點addNode() {console.log(this.get_selected_nodeid());this.get_selected_…

Vue的學習之數據與方法

前段期間&#xff0c;由于入職原因沒有學習&#xff0c;現在已經正式入職啦&#xff0c;接下來繼續加油學習。 一、數據與方法 文字備注已經在代碼中&#xff0c;方便自己學習和理解 <!DOCTYPE html> <html><head><meta charset"utf-8">&l…

如何使用HippoRAG增強LLM的記憶

大型語言模型&#xff08;LLM&#xff09;已經證明是一種非常寶貴的思考工具。經過大量文本、代碼和其他媒體數據集的訓練&#xff0c;它們能夠創作出接近人類水平的文章、翻譯語言、生成圖像&#xff0c;還能以信息豐富的方式回答人們提出的問題&#xff0c;甚至可以編寫不同類…

SQLite 附加數據庫

SQLite 附加數據庫 SQLite 是一種輕量級的數據庫管理系統,因其小巧、快速和易于使用而廣受歡迎。在 SQLite 中,可以將多個數據庫文件附加到單個數據庫連接中,從而允許用戶在不同的數據庫之間輕松切換和操作數據。本文將詳細介紹如何在 SQLite 中附加數據庫,并探討其使用場…

CANopen協議開發梳理總結筆記教程

0、提醒 CANOpen使用時&#xff0c;需要清楚什么是大端和小端&#xff0c;這對于CANOpen數據發送及解析時&#xff0c;有很大的幫助。且學習開發CANOpen時&#xff0c;需要具備一定的CAN基礎。 1、CANOpen協議介紹 ①、什么是CANOpen協議 CANOpen協議是一種架構在控制局域網絡…

基于CLIP特征的多模態大模型中的視覺短板問題

【論文極速讀】 基于CLIP特征的多模態大模型中的視覺短板問題 FesianXu 20240706 at Tencent WeChat search team 前言 今天讀到篇CVPR 24’的論文 [1]&#xff0c;討論了常見的多模態大模型&#xff08;大多都基于CLIP語義特征&#xff0c;以下簡稱為MLLM&#xff09;中的視覺…

若依 / ruoyi-ui:執行yarn dev 報錯 esnext.set.difference.v2.js in ./src/utils/index.js

一、報錯信息 These dependencies were not found: * core-js/modules/esnext.set.difference.v2.js in ./src/utils/index.js * core-js/modules/esnext.set.intersection.v2.js in ./src/utils/index.js * core-js/modules/esnext.set.is-disjoint-from.v2.js in ./src/utils…