编写非递归c语言算法求孩子兄弟链表的叶子结点个数
时间: 2024-10-09 13:01:52 浏览: 75
在非递归的C语言中,我们可以使用栈数据结构来解决这个任务。这个问题通常涉及到遍历二叉树,找到所有的叶子节点。这里是一个简单的示例算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
int countLeafNodes(TreeNode* root) {
// 使用一个栈存储待访问的节点
Stack<TreeNode*> stack;
stack.top = NULL;
int leafCount = 0; // 初始化叶子节点计数
if (root != NULL) { // 根节点不为空
stack.push(root); // 将根节点压入栈
}
while (!stack.isEmpty()) {
TreeNode* node = stack.pop(); // 弹出栈顶节点
// 如果节点是叶子节点(无左右子节点)
if (node->left == NULL && node->right == NULL) {
leafCount++; // 叶子节点计数加一
}
// 若有左子节点未访问,则压入栈
if (node->left) {
stack.push(node->left);
}
// 若有右子节点未访问,则压入栈
if (node->right) {
stack.push(node->right);
}
}
return leafCount;
}
int main() {
// 创建一个示例二叉树
TreeNode* tree = ...; // 实例化并构建二叉树
printf("叶节点总数: %d\n", countLeafNodes(tree));
return 0;
}
```
在这个算法中,我们通过不断将当前节点的左右子节点推入栈,直到遇到叶子节点为止。当一个节点的左右子节点都为空时,它就是一个叶子节点。然后我们在弹出节点的同时计数。这种方法避免了递归带来的函数调用开销。
阅读全文
相关推荐


















