二叉樹相關知識及求深度的代碼實現

文章目錄

  • 二叉樹
    • 滿二叉樹和完全二叉樹
    • 二叉樹的性質
    • 代碼實現求二叉樹的深度


樹是一種非線性的數據結構,它是由n個有限結點組成一個具有層次關系的集合。

樹的相關名詞:

  • 根節點:沒有前驅結點的結點。
  • 父節點,子節點:有 節點C節點E 的前驅節點(那么 E 就是 C 的后繼節點),稱 C 為 E 的父節點, E 為 C 的子節點。
  • 兄弟節點:具有相同的父節點的結點互稱為兄弟節點,如B,C是兄弟節點
  • 深度(高度):從根節點到葉節點依次經過的節點(含根、葉節點)形成樹的一條路徑,最長路徑的長度為樹的深度。
  • 度:該節點的子節點個數。樹的度則是其中節點度的最大值。
  • 邊:父子節點間的連線,N 個節點有 N-1 條邊。
  • 葉子節點:度為零的結點為葉子節點,如下圖中所有#

在這里插入圖片描述

二叉樹

二叉樹:每個節點最多含有兩個子樹的樹稱為二叉樹。特點如下:

  • 每個節點最多有兩棵子樹,即二叉樹不存在度大于2的節點
  • 二叉樹的子樹有左右之分,其子樹的次序不能顛倒

滿二叉樹和完全二叉樹

滿二叉樹:

一個二叉樹,如果每一層的節點數都達到最大值,則這個二叉樹就是滿二叉樹。也就是說,如果一個二叉樹的層數為K,且節點總數為(2^k)-1,則就是滿二叉樹

完全二叉樹:

滿二叉樹是一種特殊的完全二叉樹,對于深度為k的,有n個節點的二叉樹,當且僅當每一個節點都與深度為K的滿二叉樹中編號1~n的結點相對應時稱為完全二叉樹

在這里插入圖片描述
有一個很好的區分它們的方法:滿二叉樹是除葉子節點外所有節點都存在左右子樹的一棵樹,而完全二叉樹則是所有節點都是連續的,不存在有右子樹而沒有左子樹的情況

二叉樹的性質

  • 一棵非空二叉樹上的 第n層 最多有 2n-1 個節點(層數從1開始)
  • 深度為n 的二叉樹的最大節點數為 2n - 1
  • 如果葉子節點的個數為 n0度為2 的結點的個數為 n2 ,則有 n0 = n2 + 1
  • 具有 n 個節點的完全二叉樹的深度為 log2(n) + 1
  • 如果 某結點 的編號為 i(從0開始),那么他的 左孩子 編號為 2i +1右孩子 編號為 2i +2 ,他的 父節點(i - 1) / 2

代碼實現求二叉樹的深度

求樹的深度需要遍歷樹的所有節點,樹的遍歷方式總體分為兩類:

深度優先搜索(DFS)、廣度優先搜索(BFS);

  • 常見的 DFS : 先序遍歷、中序遍歷、后序遍歷;
  • 常見的 BFS : 層序遍歷(即按層遍歷)。

本文將介紹基于 后序遍歷(DFS) 和 層序遍歷(BFS) 的兩種解法。

  • DFS深度優先搜索:
/**- Definition for a binary tree node.- struct TreeNode {-     int val;-     TreeNode *left;-     TreeNode *right;-     TreeNode(int x) : val(x), left(NULL), right(NULL) {}- };*/
class Solution { // 后序遍歷
public:int maxDepth(TreeNode* root) {if(root==nullptr) return 0;return max(maxDepth(root->left), maxDepth(root->right)) + 1;}
};
  • BFS廣度優先搜索:
class Solution { // 層序遍歷
public:int maxDepth(TreeNode* root) {if(root==nullptr) return 0;queue<TreeNode*> que;que.push(root);int res = 0;while(!que.empty()){queue<TreeNode*> tmp;while(!que.empty()){TreeNode* node = que.front();que.pop();if(node->left) tmp.push(node->left);if(node->right) tmp.push(node->right);}que = tmp;res++;}return res;}
};

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

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

相關文章

平衡樹相關知識及如何判斷一棵樹是否平衡

文章目錄概念代碼實現判斷一棵二叉樹是否為平衡樹概念 平衡樹(Balance Tree&#xff0c;BT) 指的是&#xff0c;任意節點的子樹的高度差都小于等于1。 常見的符合平衡樹的有&#xff1a; B樹&#xff08;多路平衡搜索樹&#xff09;AVL樹&#xff08;二叉平衡搜索樹&#xf…

大端小端存儲模式詳解及判斷方法

文章目錄大小端模式的概念兩種模式出現原因兩種模式的優劣大小端的應用情景判斷機器的字節序大小端模式的概念 當我們查看數據在內存中的存儲情況時&#xff0c;我們經常會發現一個很奇怪的現象&#xff0c;什么現象呢&#xff1f; int main() {int i 12;return 0; }數據在內…

Linux 內存管理 | 物理內存、內存碎片、伙伴系統、SLAB分配器

文章目錄物理內存物理內存分配外部碎片內部碎片伙伴系統(buddy system)slab分配器物理內存 在Linux中&#xff0c;內核將物理內存劃分為三個區域。 在解釋DMA內存區域之前解釋一下什么是DMA&#xff1a; DMA&#xff08;直接存儲器訪問&#xff09; 使用物理地址訪問內存&am…

Linux 內存管理 | 虛擬內存管理:虛擬內存空間、虛擬內存分配

文章目錄虛擬地址空間用戶空間內核空間用戶空間內存分配malloc內核空間內存分配kmallocvmalloc虛擬地址空間 在早期的計算機中&#xff0c;程序是直接運行在物理內存上的&#xff0c;而直接使用物理內存&#xff0c;通常都會面臨以下幾種問題&#xff1a; 內存缺乏訪問控制&a…

Linux | 編譯原理、gcc的命令參數、自動化構建工具 make/Makefile

文章目錄編譯原理預處理編譯匯編鏈接gcc的常用命令參數make 和 Makefile 的概念make的運行通配符自動化變量偽目標.PHONE:【命令】編譯原理 在解釋 makefile 前&#xff0c;首先解釋一下 .c 文件變成 .exe 文件要經過的四個步驟——預處理、編譯、匯編和鏈接&#xff08;參考來…

全排列變種:限定 排列的差值范圍 及 排列中的元素個數

文章目錄題目描述思路代碼實現題目描述 詳細描述&#xff1a;字節跳動2019春招研發部分編程題——萬萬沒想到之抓捕孔連順 輸入描述&#xff1a; 第一行包含空格分隔的兩個數字 N和D(1?≤?N?≤?1000000; 1?≤?D?≤?1000000) 第二行包含N個整數&#xff08;取值區間為…

Linux | 進程概念、進程狀態(僵尸進程、孤兒進程、守護進程)、進程地址空間

文章目錄進程和程序操作系統如何控制和調度程序進程控制塊–PCB子進程進程狀態僵尸進程孤兒進程守護進程&#xff08;精靈進程&#xff09;進程地址空間引言頁表進程和程序 程序&#xff1a; 一系列有序的指令集合&#xff08;就是我們寫的代碼&#xff09;。進程&#xff1a;…

Linux 進程控制 :進程創建,進程終止,進程等待,程序替換

文章目錄進程創建進程等待程序替換進程終止進程創建 fork函數&#xff1a; 操作系統提供的創建新進程的方法&#xff0c;父進程通過調用 fork函數 創建一個子進程&#xff0c;父子進程代碼共享&#xff0c;數據獨有。 當調用 fork函數 時&#xff0c;通過 寫時拷貝技術 來拷貝…

Linux 內存管理 | 連續分配方式 和 離散分配方式

文章目錄前言連續分配單一連續分配分區式分配固定分區分配動態分區分配可重定位分區分配離散分配分段分頁多級頁表快表(TLB)段頁式Linux前言 Linux 內存管理 | 虛擬內存管理&#xff1a;虛擬內存空間、虛擬內存分配 Linux 內存管理 | 物理內存、內存碎片、伙伴系統、SLAB分配器…

操作系統 | 用戶態和內核態的切換(中斷、系統調用與過程(庫函數)調用)

文章目錄中斷過程調用系統調用過程調用和系統調用的區別中斷 用戶態、內核態之間的切換是怎么實現的? 用戶態→內核態 是通過中斷實現的。并且 中斷是唯一途徑 。核心態→用戶態 的切換是通過執行一個特權指令&#xff0c;將程序狀態字 (PSW) 的標志位設置為 用戶態 。 中斷…

管道實現父子進程的信息傳遞(二)【標準流和其文件描述符、fwrite函數、perror函數】

文章目錄代碼實現標準流 和 標準流文件描述符代碼中用到的函數fwrite()perror()在復習進程間的通信方式時又寫了一遍&#xff0c;和 管道實現父子進程的信息傳遞&#xff08;一&#xff09;【fork函數、pipe函數、write/read操作、wait函數】 的區別不是特別大&#xff0c;只是…

JAVA隨機生成文件名:當前年月日時分秒+五位隨機數

代碼如下&#xff1a; package cn.gov.csrc.util;import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random;public class RandomUtil {/*** 生成隨機文件名&#xff1a;當前年月日時分秒五位隨機數* * return*/public static String getRandomFile…

命名管道實現進程的信息傳遞【mkfifo函數、open函數】

文章目錄代碼實現mkfifo函數open函數代碼實現 #include<fcntl.h> // open() #include<sys/wait.h> // wait() #include<sys/types.h> // mkfifo() #include<sys/stat.h> // mkfifo() #include<iostream> #include<unistd.h> // fork()usi…

Linux 進程 | 進程間的通信方式

文章目錄管道匿名管道 pipe命名管道 FIFO共享內存共享內存的使用流程&#xff1a;消息隊列信號量套接字在之前的博客中講過&#xff0c;虛擬空間出現的其中一個目的就是解決 進程沒有獨立性&#xff0c;可能訪問同一塊物理內存 的問題。因為這種獨立性&#xff0c;進程之間無法…

Linux網絡編程 | socket介紹、網絡字節序與主機字節序概念與兩者的轉換、TCP/UDP 連接中常用的 socket 接口

文章目錄套接字socket 地址通用 socket 地址專用 socket 地址網絡字節序與主機字節序地址轉換TCP/UDP 連接中常用的 socket 接口套接字 什么是套接字&#xff1f; 所謂 套接字 (Socket) &#xff0c;就是對網絡中 不同主機 上的應用進程之間進行雙向通信的端點的抽象。 UNIX/L…

網絡協議分析 | 傳輸層 :史上最全UDP、TCP協議詳解,一篇通~

文章目錄UDP概念格式UDP如何實現可靠傳輸基于UDP的應用層知名協議TCP概念格式保證TCP可靠性的八種機制確認應答、延時應答與捎帶應答超時重傳滑動窗口滑動窗口協議后退n協議選擇重傳協議流量控制擁塞控制發送窗口、接收窗口、擁塞窗口快速重傳和快速恢復連接管理機制三次握手連…

JDom,jdom解析xml文件

1.要解析的文件模板如下&#xff1a; <?xml version"1.0" encoding"GBK"?> <crsc> <data><舉報信息反饋><R index"1"><舉報編號>1</舉報編號><狀態>1</狀態><答復意見>填寫…

網絡協議分析 | 應用層:HTTP協議詳解、HTTP代理服務器

文章目錄概念URLHTTP協議的特點HTTP協議版本格式請求報文首行頭部空行正文響應報文首行頭部空行正文Cookie與SessionHTTP代理服務器正向代理服務器反向代理服務器透明代理服務器概念 先了解一下 因特網&#xff08;Internet&#xff09; 與 萬維網&#xff08;World Wide Web&…

MySQL命令(一)| 數據類型、常用命令一覽、庫的操作、表的操作

文章目錄數據類型數值類型字符串類型日期/時間類型常用命令一覽庫的操作顯示當前數據庫創建數據庫使用數據庫刪除數據庫表的操作創建表顯示當前庫中所有表查看表結構刪除表數據類型 mysql 的數據類型主要分為 數值類型、日期/時間類型、字符串類型 三種。 數值類型 數值類型可…

C++ 繼承 | 對象切割、菱形繼承、虛繼承、對象組合

文章目錄繼承繼承的概念繼承方式及權限using改變成員的訪問權限基類與派生類的賦值轉換回避虛函數機制派生類的默認成員函數友元與靜態成員多繼承菱形繼承虛繼承組合繼承 繼承的概念 繼承可以使得子類具有父類的屬性和方法或者重新定義、追加屬性和方法等。 當創建一個類時&…