用C语言写一个分别采用递归和非递归方式编写两个函数,求一棵给定二叉树中叶子结点的个数的代码
时间: 2024-06-16 12:02:52 浏览: 105
当我们用C语言编写一个函数来求一棵给定二叉树中叶子节点的个数时,可以分别采用递归和非递归的方式实现。
1. 递归方式:
递归方式是通过不断地调用函数自身来实现的。对于二叉树的叶子节点个数的求解,可以使用以下递归函数:
```c
// 定义二叉树结点的结构体
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
// 递归函数,用于求解二叉树中叶子节点的个数
int countLeafNodes(struct TreeNode* root) {
// 如果当前节点为空,则返回0
if (root == NULL) {
return 0;
}
// 如果当前节点没有左子树和右子树,则为叶子节点,返回1
if (root->left == NULL && root->right == NULL) {
return 1;
}
// 递归地计算左子树和右子树中叶子节点的个数,并返回它们的和
return countLeafNodes(root->left) + countLeafNodes(root->right);
}
```
2. 非递归方式:
非递归方式是通过使用辅助数据结构(如栈或队列)来实现的。对于二叉树的叶子节点个数的求解,可以使用以下非递归函数:
```c
// 非递归函数,用于求解二叉树中叶子节点的个数
int countLeafNodes(struct TreeNode* root) {
// 如果根节点为空,则返回0
if (root == NULL) {
return 0;
}
int count = 0;
struct TreeNode* stack[100]; // 定义一个栈,用于存储待处理的节点
int top = -1; // 栈顶指针初始化为-1
stack[++top] = root; // 将根节点入栈
while (top >= 0) {
struct TreeNode* node = stack[top--]; // 弹出栈顶节点
// 如果当前节点没有左子树和右子树,则为叶子节点,计数器加1
if (node->left == NULL && node->right == NULL) {
count++;
}
// 如果当前节点有右子树,则将右子树入栈
if (node->right != NULL) {
stack[++top] = node->right;
}
// 如果当前节点有左子树,则将左子树入栈
if (node->left != NULL) {
stack[++top] = node->left;
}
}
return count;
}
```
阅读全文