C语言实现统计二叉树中只有左孩子的结点个数问题
时间: 2024-01-28 15:05:53 浏览: 65
以下是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树结构体
typedef struct node {
int data;
struct node *left, *right;
} Node;
// 创建二叉树
Node* createTree() {
int val;
printf("请输入节点的值(-1表示结束):");
scanf("%d", &val);
if (val == -1) {
return NULL;
}
Node* root = (Node*)malloc(sizeof(Node));
root->data = val;
root->left = createTree();
root->right = createTree();
return root;
}
// 统计只有左孩子的结点个数
int countOnlyLeft(Node* root) {
// 如果为空,返回0
if (root == NULL) {
return 0;
}
// 如果左子结点为空,且右子结点不为空,则该结点是只有左孩子的结点
if (root->left != NULL && root->right == NULL) {
return 1 + countOnlyLeft(root->left);
}
// 否则递归遍历左右子树
return countOnlyLeft(root->left) + countOnlyLeft(root->right);
}
int main() {
Node* root = createTree();
int count = countOnlyLeft(root);
printf("只有左孩子的结点个数为:%d\n", count);
return 0;
}
```
该程序中,首先通过 `createTree` 函数创建一棵二叉树。然后,通过 `countOnlyLeft` 函数统计只有左孩子的结点个数。具体实现过程如下:
- 如果当前结点为空,返回0。
- 如果当前结点的左子结点不为空且右子结点为空,则该结点是只有左孩子的结点,返回1加上遍历左子树的结果。
- 否则递归遍历左右子树,返回两个子树的结果之和。
最后,在 `main` 函数中调用 `countOnlyLeft` 函数统计只有左孩子的结点个数,并输出结果。
阅读全文