二叉樹的講解

💓博主個人主頁:不是笨小孩👀
?專欄分類:數據結構與算法👀 刷題專欄👀 C語言👀
🚚代碼倉庫:笨小孩的代碼庫👀
?社區:不是笨小孩👀
🌹歡迎大家三連關注,一起學習,一起進步!!💓

在這里插入圖片描述

二叉樹

  • 二叉樹的性質
  • 二叉樹的鏈式結構
    • 二叉樹的遍歷
      • 前序遍歷
      • 中序遍歷
      • 后序遍歷
      • 層序遍歷
    • 二叉樹的銷毀
    • 二叉樹的查找

二叉樹的性質

1.若規定根節點的層數為1,則一棵非空二叉樹的第i層上最多有2^(i-1) 個結點.
2. 若規定根節點的層數為1,則深度為h的二叉樹的最大結點數是 2^h-1.
3. 對任何一棵二叉樹, 如果度為0其葉結點個數為n0 , 度為2的分支結點個數為02 ,則有n0 =n2 +1
4. 若規定根節點的層數為1,具有n個結點的滿二叉樹的深度,h= . (ps: 是log以2為底,n+1為對數)
5. 對于具有n個結點的完全二叉樹,如果按照從上至下從左至右的數組順序對所有節點從0開始編號,則對于序號為i的結點有:

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

二叉樹的鏈式結構

一般來說,二叉樹分為二叉鏈和三叉鏈,二叉鏈就是結構里面一個左孩子節點,一個右孩子節點,三叉鏈多了一個父親節點,我們比較經常見的都是二叉鏈的,所以我們主要講的也是二叉鏈。

結構:

typedef int BTDataType;typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;

我們在看任意一顆二叉樹時,都可以將它分為三部分,根,左子樹,右子樹,左子樹也可看成根,左子樹,右子樹,右子樹也可看成根,左子樹,右子樹,因此二叉樹定義是遞歸式的,我們后面的代碼也是主要靠遞歸來實現的。

二叉樹的遍歷

二叉樹遍歷(Traversal)是按照某種特定的規則,依次對二叉樹中的節點進行相應的操作,并且每個節點只操作一次。

二叉樹的遍歷分為,前序遍歷、中序遍歷、后序遍歷、層序遍歷,其中前中后序遍歷是遞歸定義的,而層序遍歷是非遞歸遍歷的。

前序遍歷

前序遍歷(Preorder Traversal 亦稱先序遍歷)——訪問根結點的操作發生在遍歷其左右子樹之前。前序先訪問根節點,再訪問左子樹,再訪問右子樹。

在這里插入圖片描述

代碼如下:

// 二叉樹前序遍歷 
void BinaryTreePrevOrder(BTNode* root)
{if (root == NULL){return;}printf("%d ", root->data);BinaryTreePrevOrder(root->left);BinaryTreePrevOrder(root->right);
}

遞歸圖:
在這里插入圖片描述
大家可以根據這個遞歸展開圖好好理解一下,后面的二叉樹基本操作都是需要用遞歸來實現的。

中序遍歷

中序遍歷(Inorder Traversal)——訪問根結點的操作發生在遍歷其左右子樹之中(間)。

代碼如下:

// 二叉樹中序遍歷
void BinaryTreeInOrder(BTNode* root)
{if (root == NULL){return;}BinaryTreeInOrder(root->left);printf("%d ", root->data);BinaryTreeInOrder(root->right);}

后序遍歷

后序遍歷(Postorder Traversal)——訪問根結點的操作發生在遍歷其左右子樹之后。

代碼如下:

// 二叉樹后序遍歷
void BinaryTreePostOrder(BTNode* root)
{if (root == NULL){return;}BinaryTreePostOrder(root->left);BinaryTreePostOrder(root->right);printf("%d ", root->data);
}

這三種遍歷本質上都是一樣的,理解清楚一個,另外兩個就很簡單了。

層序遍歷

層序遍歷和其他三種都不一樣,設二叉樹的根節點所在層數為1,層序遍歷就是從所在二叉樹的根節點出發,首先訪問第一層的樹根節點,然后從左右訪問第2層上的節點,接著是第三層的節點,以此類推,自上而下,自左至右逐層訪問樹的結點的過程就是層序遍歷。

在這里插入圖片描述

那這個要怎么實現呢?

我們需要借助我們的隊列,我們可以先把根節點入到隊列里,然后開始出隊列,只不過每次出的時候如果它的左孩子不為空就將左孩子入隊列,右孩子不為空就將右孩子入隊列,以此類推。我們就是利用了隊列的先進先出,我們就可以輕松地完成層序遍歷。

代碼如下:

// 層序遍歷
void BinaryTreeLevelOrder(BTNode* root)
{Queue q;QueueInit(&q);if (root){QueuePush(&q,root);}while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);if (front->left){QueuePush(&q, front->left);}if (front->right){QueuePush(&q, front->right);}printf("%d ", front->data);}printf("\n");
}

二叉樹的銷毀

二叉樹的銷毀很簡單,我們需要遍歷一遍二叉樹,但是我們用那種遍歷呢,如果用前序,那么就會銷毀根節點,就找不到它的左孩子和右孩子,明顯是不合適的,最好的情況就是我們先去銷毀它的左孩子,再去銷毀他的右孩子,然后再銷毀根節點,所以這里我們使用后序遍歷是比較合適的。

代碼如下:

// 二叉樹銷毀
void BinaryTreeDestory(BTNode* root)
{if (root == NULL){return;}BinaryTreeDestory(root->left);BinaryTreeDestory(root->right);free(root);
}

二叉樹的查找

二叉樹的查找的基本思路也是遍歷一遍二叉樹,但是我們需要返回這個節點,這就給我們的難度增加了很多,我們這里想的是先看根節點是不是,如果不是就去他的左子樹找,如果找到了就返回,否則就去它的右子樹找,找到就返回該節點,最后都找不到我們就返回NULL.

代碼如下:

// 二叉樹查找值為x的節點
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{if (root == NULL){return NULL;}if (root->data == x){return root;}BTNode* left = BinaryTreeFind(root->left, x);if (left != NULL){return left;}BTNode* right = BinaryTreeFind(root->right, x);if (right != NULL){return right;}return NULL;
}

最后帶大家看一下會給我們帶來好運的樹:
在這里插入圖片描述

今天的分享就到這里,感謝大家的關注和支持!

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

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

相關文章

詳解C語言中的int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t

2023年8月8日&#xff0c;周二上午 目錄 為什么會產生int8_t、uint8_t等這類數據類型int8_t、uint8_t等這類數據類型有什么用頭文件int8_t、uint8_t等這類數據類型是怎么實現的 為什么會產生int8_t、uint8_t等這類數據類型 根本原因在于&#xff0c;C 語言標準只是規定了各個…

SQL | 匯總數據

9-匯總數據 9.1-聚集函數 在實際開發過程中&#xff0c;可能會遇到下面這些情況&#xff1a; 確定大于某個值的有多少行數據&#xff0c;比如游戲排行榜&#xff0c;查詢玩家排行多少名。 獲取表中某些行的和&#xff0c;比如雙十一當天&#xff0c;某個用戶總訂單價格是多少…

學習篇之React Fiber概念及原理

什么是React Fibber&#xff1f; React Fiber 是 React 框架的一種底層架構&#xff0c;為了改進 React 的渲染引擎&#xff0c;使其更加高效、靈活和可擴展。 傳統上&#xff0c;React 使用一種稱為堆棧調和遞歸算法來處理虛擬 DOM 的更新&#xff0c;這種方法在大型應用或者…

最強自動化測試框架Playwright(7)- 使用cookie避免重復登錄

playwright在稱為瀏覽器上下文的隔離環境中執行測試。這種隔離模型提高了可重復性&#xff0c;并防止了級聯測試失敗。測試可以加載現有的經過身份驗證的狀態。這消除了在每次測試中進行身份驗證的需要&#xff0c;并加快了測試執行速度。 每次測試前登錄 以下示例登錄到 Git…

談談什么是云計算?以及它的應用

作者&#xff1a;Insist-- 個人主頁&#xff1a;insist--個人主頁 作者會持續更新網絡知識和python基礎知識&#xff0c;期待你的關注 目錄 ?編輯 一、什么是云計算 二、云計算的優勢與劣勢&#xff1f; 1、云計算的優勢 ①提高資源利用率 ②提升效率 ③降低成本 2、云…

python編程基礎與案例集錦,python編程入門經典

大家好&#xff0c;本文將圍繞python編程基礎與案例集錦展開說明&#xff0c;python編程入門與案例詳解是一個很多人都想弄明白的事情&#xff0c;想搞清楚python入門程序例子需要先了解以下幾個事情。 【程序1】 題目&#xff1a;輸入一行字符&#xff0c;分別統計出其中英文字…

『CV學習筆記』Opencv和PIL Image以及base64編碼互相轉化

Opencv和PIL Image以及base64編碼互相轉化 文章目錄 一. opencv&PIL.Image&Skimage1.1. opencv-python讀取透明圖片(帶alpha通道)1.2. opencv、PIL.Image、Skimage讀取的彩色圖片維度區別1.3. opencv、PIL.Image轉換二. base64和cv2 imge互相轉換三. base64和PIL imge互…

射頻入門知識-混頻器-1

5.4混頻電路-視頻_嗶哩嗶哩_bilibili ???????

【算法題】螺旋矩陣II (求解n階Z形矩陣)

一、問題的提出 n階Z形矩陣的特點是按照之(Z)字形的方式排列元素。n階Z形矩陣是指矩陣的大小為nn&#xff0c;其中n為正整數。 題目描述 一個 n 行 n 列的螺旋(Z形)矩陣如圖1所示&#xff0c;觀察并找出填數規律。 圖1 7行7列和8行8列的螺旋(Z形)矩陣 現在給出矩陣大小 n&…

數據結構入門:棧

目錄 前言 1. 棧 1.1棧的概念及結構 1.2 棧的實現 1.2.1 棧的定義 1.2.2 棧的初始化 1.2.3 入棧 1.2.4 出棧 1.2.5 棧的元素個數 1.2.6 棧頂數據 1.2.7 棧的判空 2.棧的應用 2.1 題目一&#xff1a;括號匹配 2.1.1 思路 2.1.2 分析 2.1.3 題解 總結 前言 無論你是計算機科學專…

CVE漏洞復現-CVE-2021-22555 Linux Netfilter 權限提升漏洞

CVE-2021-22555 Linux Netfilter 權限提升漏洞 漏洞描述 近日&#xff0c;互聯網公開了Linux Netfilter權限提升漏洞的POC及EXP&#xff0c;相關CVE編號&#xff1a;CVE-2021-22555。該漏洞在kCTF中被用于攻擊kubernetes pod容器實現虛擬化逃逸&#xff0c;該漏洞已在Linux內…

用chatGPT從左右眼圖片生成點云數據

左右眼圖片 需求 需要將左右眼圖像利用視差生成三維點云數據 先問問chatGPT相關知識 進一步問有沒有現成的軟件 chatGPT提到了OpenCV&#xff0c;我們讓chatGPT用OpenCV寫一個程序來做這個事情 當然&#xff0c;代碼里面會有一些錯誤&#xff0c;chatGPT寫的代碼并不會做模…

Arduino驅動MQ2模擬煙霧傳感器(氣體傳感器篇)

目錄 1、傳感器特性 2、硬件原理圖 3、控制器和傳感器連線圖 4、驅動程序 MQ2氣體傳感器,可以很靈敏的檢測到空氣中的煙霧、液化氣、丁烷、丙烷、甲烷、酒精、氫氣等氣體,與Arduino結合使用,可以制作火災煙霧報警、液化氣、丁烷、丙烷、甲烷、酒精、氫氣氣體泄露報警等相…

面試題. 字符串壓縮

字符串壓縮。利用字符重復出現的次數&#xff0c;編寫一種方法&#xff0c;實現基本的字符串壓縮功能。比如&#xff0c;字符串aabcccccaaa會變為a2b1c5a3。若“壓縮”后的字符串沒有變短&#xff0c;則返回原先的字符串。你可以假設字符串中只包含大小寫英文字母&#xff08;a…

【JavaEE進階】Spring 更簡單的讀取和存儲對象

文章目錄 一. 存儲Bean對象1. 配置掃描路徑2. 添加注解存儲 Bean 對象2.1 使用五大類注解存儲Bean2.2 為什么要有五大類注解&#xff1f;2.3 有關獲取Bean參數的命名規則 3. 使用方法注解儲存 Bean 對象3.1 方法注解儲存對象的用法3.2 Bean的重命名3.3 同?類型多個 Bean 報錯 …

Spring Boot單元測試與Mybatis單表增刪改查

目錄 1. Spring Boot單元測試 1.1 什么是單元測試? 1.2 單元測試有哪些好處? 1.3 Spring Boot 單元測試使用 單元測試的實現步驟 1. 生成單元測試類 2. 添加單元測試代碼 簡單的斷言說明 2. Mybatis 單表增刪改查 2.1 單表查詢 2.2 參數占位符 ${} 和 #{} ${} 和 …

學點Selenium玩點新鮮~,讓分布式測試有更多玩法

前 言 我們都知道 Selenium 是一款在 Web 應用測試領域使用的自動化測試工具&#xff0c;而 Selenium Grid 是 Selenium 中的一大組件&#xff0c;通過它能夠實現分布式測試&#xff0c;能夠幫助團隊簡單快速在不同的環境中測試他們的 Web 應用。 分布式執行測試其實并不是一…

opencv,opengl,osg,vulkan,webgL,opencL,cuda

OpenCV OpenCV是一個基于BSD許可&#xff08;開源&#xff09;發行的跨平臺計算機視覺和機器學習軟件庫&#xff0c;可以運行在Linux、Windows、Android和Mac OS操作系統上。 它輕量級而且高效——由一系列 C 函數和少量 C 類構成&#xff0c;同時提供了Python、Ruby、MATLAB等…

安卓java A應用切換到B應用,來回切換不執行OnCreate

需求&#xff1a;安卓java如何做到A應用切換到B應用&#xff0c;如果B應用沒啟動就啟動&#xff0c;如果B應用已經啟動就僅僅切換到B應用。B應用再切換回A應用&#xff0c;不要重復執行OnCreate! 在 A 應用中的&#xff1a; 在 A 應用中&#xff0c;如果你希望在切換回 B 應用…

小米平板6Max14即將發布:自研G1 電池管理芯片,支持33W反向快充

明天晚上7點&#xff08;8 月 14 日&#xff09;&#xff0c;雷軍將進行年度演講&#xff0c;重點探討“成長”主題。與此同時&#xff0c;小米將推出一系列全新產品&#xff0c;其中包括備受矚目的小米MIX Fold 3折疊屏手機和小米平板6 Max 14。近期&#xff0c;小米官方一直在…