已知一颗以二叉链表存储的二叉树,T指针指向其根节点,请设计算法求出该二叉树所有叶子结点深度之和,以及非叶子结点个数,c语言
时间: 2025-07-05 13:01:28 浏览: 13
为了计算给定二叉链表表示的二叉树的所有叶子节点深度之和及非叶子节点的个数,我们可以采用递归的方式来遍历整个二叉树。以下是C语言的一个基本算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 计算深度
int getDepth(TreeNode* node, int depth = 0) {
if (!node)
return depth; // 如果为空节点,返回当前深度
else {
int leftDepth = getDepth(node->left, depth+1);
int rightDepth = getDepth(node->right, depth+1);
return max(leftDepth, rightDepth); // 返回左右子树的最大深度
}
}
// 判断是否为叶子节点
int isLeaf(TreeNode* node) {
return !node->left && !node->right;
}
// 主函数
void calculate(TreeNode* T) {
int leafSum = 0, nonLeafCount = 0;
if (T != NULL) { // 遍历根节点
leafSum += getDepth(T); // 叶子节点深度之和
if (!isLeaf(T)) ++nonLeafCount; // 非叶子节点计数
// 递归处理左右子树
calculate(T->left);
calculate(T->right);
}
printf("叶子节点深度之和: %d\n", leafSum);
printf("非叶子节点个数: %d\n", nonLeafCount);
}
int main() {
// 初始化你的二叉树并传入根节点
TreeNode* T = ...; // 你的二叉树根节点初始化代码
calculate(T);
return 0;
}
```
这个算法首先通过`getDepth`函数计算每个节点的深度,然后在`calculate`函数中,对每个节点判断是否是叶子节点并累加到相应的结果中。注意这里的`max`函数需要你自己实现或者从头文件里包含。
阅读全文
相关推荐


















