【c++】計算樹的深度和節點數

在C語言中,計算給定樹的層數(深度)和節點總數通常需要使用遞歸方法。首先,我們需要定義樹的節點結構。這里假設我們處理的是一棵二叉樹,每個節點有兩個子節點(左子節點和右子節點)。

下面是一個簡單的二叉樹節點的結構定義以及計算樹的層數(深度)和節點總數的函數實現:

#include <stdio.h>
#include <stdlib.h>// 定義二叉樹節點結構體
typedef struct TreeNode {int value; // 節點存儲的值,根據實際情況可以改變類型struct TreeNode *left; // 指向左子節點的指針struct TreeNode *right; // 指向右子節點的指針
} TreeNode;// 函數聲明
int maxDepth(TreeNode* root);
int countNodes(TreeNode* root);// 計算樹的最大深度(層數)
int maxDepth(TreeNode* root) {if (root == NULL) {return 0; // 空樹的深度為0}int leftDepth = maxDepth(root->left); // 計算左子樹的深度int rightDepth = maxDepth(root->right); // 計算右子樹的深度return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1; // 當前樹的深度為較大的子樹深度加1
}// 計算樹的節點總數
int countNodes(TreeNode* root) {if (root == NULL) {return 0; // 空樹沒有節點}return countNodes(root->left) + countNodes(root->right) + 1; // 總數等于左子樹節點數加右子樹節點數再加1(當前節點)
}// 創建新節點
TreeNode* createNode(int value) {TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));if (!newNode) {return NULL;}newNode->value = value;newNode->left = NULL;newNode->right = NULL;return newNode;
}// 函數聲明
void freeTree(TreeNode* root);// 釋放樹的內存
void freeTree(TreeNode* root) {if (root == NULL) {return; // 空指針不需要處理}freeTree(root->left); // 遞歸釋放左子樹freeTree(root->right); // 遞歸釋放右子樹free(root); // 釋放當前節點
}// 主函數示例
int main() {// 創建示例樹//         1//       /   \//      2     3//     / \   ///    4   5 6TreeNode* root = createNode(1);root->left = createNode(2);root->right = createNode(3);root->left->left = createNode(4);root->left->right = createNode(5);root->right->left = createNode(6);printf("Tree Depth: %d\n", maxDepth(root));printf("Total Nodes: %d\n", countNodes(root));// 釋放內存freeTree(root);return 0;
}

這段代碼首先定義了二叉樹節點的結構體TreeNode,然后實現了兩個關鍵函數:maxDepth用于計算樹的最大深度(層數),而countNodes用于計算樹的節點總數。這兩個函數都采用了遞歸的方式來進行計算。

要將計算樹深度和總節點數的功能合并到一個函數中,我們可以定義一個輔助結構來同時存儲這兩個值
首先,定義一個結構體來存儲樹的深度和節點總數:

#include <stdio.h>
#include <stdlib.h>typedef struct TreeNode {int value;struct TreeNode *left, *right;
} TreeNode;typedef struct TreeInfo {int depth;int numNodes;
} TreeInfo;

然后,實現一個遞歸函數來計算深度和節點總數:

TreeInfo calculateTreeInfo(TreeNode* root) {TreeInfo info = {0, 0}; // 初始化深度和節點數為0if (root == NULL) {return info; // 如果當前節點為空,返回深度和節點數都為0的結構}// 遞歸計算左右子樹的信息TreeInfo leftInfo = calculateTreeInfo(root->left);TreeInfo rightInfo = calculateTreeInfo(root->right);// 當前節點的深度是左右子樹深度的最大值加1info.depth = (leftInfo.depth > rightInfo.depth ? leftInfo.depth : rightInfo.depth) + 1;// 節點總數是左右子樹節點數之和加上當前節點(1)info.numNodes = leftInfo.numNodes + rightInfo.numNodes + 1;return info; // 返回包含當前節點信息的結構
}

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

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

相關文章

5.STL源碼解析-算法、仿函數、適配器

算法 STL算法總覽 仿函數與適配器 C標準模板庫&#xff08;STL&#xff09;是C程序員的得力工具&#xff0c;提供了許多強大而高效的數據結構和算法。在STL中&#xff0c;仿函數&#xff08;Functor&#xff09;和適配器&#xff08;Adapter&#xff09;是兩個重要的概念…

C語言文件操作(fputs() 和 puts() 有兩個小區別)

fputs() 和 puts() 有兩個小區別&#xff1a; 1.puts() 只能向標準輸出流輸出&#xff0c;而 fputs() 可以向任何流輸出。 2.使用 puts() 時&#xff0c;系統會在自動在其后添加換行符&#xff1b;而使用 fputs() 時&#xff0c;系統不會自動添加換行符。 那么這是不是意味著使…

【C++精簡版回顧】17.io流,流中提供的函數

1.流含義 2.流類 3.流對象 4.流對象的函數 舉例&#xff1a; 要求&#xff1a;數據結構中經常需要對齊輸出數據&#xff0c;應該怎么做&#xff1f; 1.頭文件 #include<iomanip> 2.創建表格頭 cout << setiosflags(ios::left) << setw(8) << "姓名…

BUGKU 網站被黑

打開環境&#xff0c;什么都沒發現&#xff0c;使用蟻劍掃描一下&#xff0c;發現shell.php&#xff0c;打開 使用BP抓包&#xff0c;進行爆破 得到密碼&#xff1a;hack 進去得到flag

GEE高階應用python wxee——如何利用來自 GOES-16 和 MODIS 的數據來可視化火災隨時間的進展分析

火災進展 wxee 是專為處理氣象數據而設計的,但它對遙感數據也很有用。在本示例中,我們將了解 wxee 如何利用來自 GOES-16 和 MODIS 的數據來可視化火災隨時間的進展情況。 安裝和設定 #!pip install wxeeimport ee import wxeeee.Authenticate() wxee.Initialize(project=x…

每日一類:QLabel深入解析

QLabel是Qt中用于顯示文本或圖像的控件&#xff0c;屬于Qt Widgets模塊。它是展示靜態內容的理想選擇&#xff0c;支持富文本格式&#xff0c;使得文本可以包含不同的字體、顏色和鏈接。QLabel也可以用來顯示圖像&#xff0c;包括動態圖像。此外&#xff0c;它還支持文本和圖像…

【Java面試題】SpringBoot與Spring的區別

主要區別體現幾個方面&#xff1a; 1.操作簡便性 SpringBoot提供極其快速和簡化的操作&#xff0c;使得Spring開發者能更快速上手。它通過提供spring的運行配置&#xff0c;以及為通用spring項目提供許多非功能性特性&#xff0c;進一步簡化了開發過程。 2.框架擴展性 Spri…

算法學習——差分

在了解差分之前&#xff0c;我們首先需要知道前綴和的概念。 前綴和簡單介紹&#xff1a; 對于一個數組A&#xff0c;要求出A[0]~A[i]的和&#xff0c;我們通常的做法是遍歷一邊&#xff0c;加起來。但是要求m組這樣的和&#xff0c;我們就要花費O(mn)的時間復雜度。顯然不合…

【考研數學】湯家鳳1800題什么水平?

我覺得湯家鳳基礎武忠祥強化這個組合非常的不錯 湯家鳳老師的講課風格 湯家鳳老師的基礎課程是大家公認的講的詳細&#xff0c;并且非常照顧基礎不好的學生&#xff0c;會把基礎知識點掰開揉碎的講給大家聽&#xff0c;在上課過程中&#xff0c;還會把知識點寫在A4紙上&#…

試了下新型的360AI搜索

360AI搜索 試了下&#xff0c;感覺還是挺不錯的。 比如問這個問題&#xff1a; ERROR 1698 (28000): Access denied for user rootlocalhost 它的回答&#xff1a; 對于ERROR 1698 (28000): Access denied for user rootlocalhost的問題&#xff0c;這通常是由于MySQL密碼為…

【Javascript】設計模式之單例模式

文章目錄 1、實現單例模式2、透明的單例模式3、用代理實現單例模式4、JavaScript 中的單例模式5、惰性單例6、通用的惰性單例7、小結 定義&#xff1a; 保證一個類僅有一個實例&#xff0c;并提供一個訪問它的全局訪問點 單例模式是一種常用的模式&#xff0c;有一些對象我們往…

JavaScript 學習總結(16)—— 實用小函數總結

1.匹配正整數 // 匹配正整數 let isPositiveNum = val => {return /^[1-9]d*$/.test(val); }; console.log(isPositiveNum(9)) //true console.log(isPositiveNum(2.2)) //false 2.匹配負整數 // 匹配負整數let isNegativeNum = val => {return /^-[1-9]d*$/.test(val…

R750 install AMD MI210GPU

一、 查看服務器GPU卡信息 可以首先在服務器上check 當前GPU的詳細信息是否匹配 二、安裝 Ubuntu22.04操作系統 服務器CHECK 安裝的AMD GPU 是否被系統識別 #lspci | grep AMD 查看GPU信息 可以看到已經識別成功 三、安裝AMD GPU驅動 https://rocm.docs.amd.com/projec…

linux 根目錄下結構

/ 虛擬目錄的根的目錄&#xff0c;通常不會在這里放置文件 /bin&#xff1a;存放頻繁使用的命令,二進制文件&#xff0c;存放了很多用戶級的GNU實用工具。 /boot&#xff1a;引導目錄&#xff0c;存放引導文件&#xff0c;包含啟動Linux所需的核心文件。 /dev&#xff1a;設…

智能駕駛規劃控制理論學習05-車輛運動學規劃案例分析

目錄 案例一——Hybrid A*&#xff08;基于正向運動學&#xff09; 1、基本思想 2、 實現流程 3、啟發函數設計 4、分析擴張&#xff08;Analytic Expansions&#xff09; 5、分級規劃&#xff08;Hierarchical planning&#xff09; 案例二——State Lattice Planning&…

子矩陣的和 刷題筆記 {二維前綴和}

首先我們的目標是讓 s[i][j]表示為其左方和上方形成的矩陣所有元素的和 加上s[i-1][j]和s[i][j-1]后 s[i-1][j-1]部分重復了所以減去 最后加上a[i][j]即可完成目標 s[i][j]s[i-1][j]s[i][j-1]-s[i-1][j-1]a[i][j]; 然后看題目要求 要求x1,y1,x2,y2圍成的小正方形內的元素和…

C/C++工程師面試題(數據庫篇)

索引的優缺點 索引是一種支持快速查找特定行的數據結構&#xff0c;如果沒有索引&#xff0c;就需要遍歷整個表進行查找。用于提高數據檢索的速度和效率。 好處&#xff1a; 提高檢索速度&#xff1a; 索引可以加快數據的檢索速度&#xff0c;因為它們允許數據庫系統直接定位到…

Revit-二開之立面視圖創建FilledRegion-(3)

在上一篇博客中介紹了FilledRegion的創建方法,這種方法通常只在平面視圖中適用,在三維視圖中也是無法創建的(目前研究的是這樣的,如果有其他方法,請賜教)。 本片文章介紹一個下在立面視圖中創建FilledRegion的方法,主要操作是在立面視圖中拾取一個點,然后以該點為原點,…

YOLOv5 項目:推理代碼和參數詳細介紹(detect)

1、前言 本章將介紹yolov5項目的推理函數&#xff0c;關于yolov5的下載和配置環境&#xff0c;參考上一篇文章&#xff1a; YOLOv5 項目&#xff1a;環境配置-CSDN博客 pycharm 中打開的推理模塊如紅框中所示 pycharm將conda新建的虛擬環境導入&#xff0c;參考 &#xff1a;…

快速模冪(c++題解)

題目描述 試求ab%n的值&#xff0c;其中a、b、n均為整數范圍內的數。 輸入格式 三個整數即a、b、n。 輸出格式 輸出結果。 樣例 樣例輸入 復制1 1 1樣例輸出 復制0 _____________________________________________________________________________ ok呀總算學到一個…