在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; // 返回包含當前節點信息的結構
}