【描述】(二又树叶子结点计数实现) 以数字按先序遍历次序输入二叉树各结点值,0表示空,输出该二双树叶子结点数。c语言
时间: 2024-11-09 07:18:07 浏览: 18
在C语言中,为了计算二叉树的叶子节点(即无左孩子和右孩子的节点)数量,你可以使用递归的方式实现先序遍历。下面是一个简单的算法步骤:
1. 定义结构体`Node`表示二叉树的节点,包含整数值`val`、指向左子节点的指针`left`和指向右子节点的指针`right`。
```c
typedef struct Node {
int val;
struct Node* left;
struct Node* right;
} TreeNode;
```
2. 编写一个函数`countLeavesHelper`作为递归辅助函数,它接收当前节点`node`作为参数,如果`node`是叶子节点,就累加计数器并返回;否则,分别检查`node`的左右子节点,并递归地对它们进行处理。
```c
int countLeavesHelper(TreeNode* node, int count) {
if (!node) return count; // 如果节点为空,结束递归
if (!node->left && !node->right) { // 当前节点是叶子节点
count++;
}
return countLeavesHelper(node->left, count); // 继续处理左子节点
}
```
3. 最终,主函数`countLeaves`会创建一个栈来保存待处理的节点,初始化计数器为0,然后开始遍历。
```c
int countLeaves(TreeNode* root) {
if (!root) return 0; // 空树没有叶子节点
int count = 0;
TreeNode* current = root;
while (current || stack) { // 使用栈存储待处理节点
while (current) {
push(&stack, current);
current = current->left;
}
current = pop(stack);
count += countLeavesHelper(current, 0);
current = current->right;
}
return count;
}
// 假设你有一个push和pop操作的栈API
void push(stack*, TreeNode* node) {
/* ... */
}
TreeNode* pop(stack*) {
/* ... */
}
```
阅读全文