如何使用C语言和二叉链表数据结构来表示二叉树,并通过层次遍历方法计算非叶子节点的数量?
时间: 2024-11-09 22:26:13 浏览: 8
头歌数据结构二叉树的二叉链表存储及基本操作
5星 · 资源好评率100%
在C语言中,我们可以使用二叉链表数据结构来表示二叉树。每个节点包含三个部分:一个指向左孩子的指针、一个指向右孩子的指针以及存储节点值的数据域。为了表示二叉树,首先创建一个结构体定义:
```c
typedef struct TreeNode {
int data; // 节点值
struct TreeNode* left; // 左孩子指针
struct TreeNode* right; // 右孩子指针
} TreeNode;
```
层次遍历(广度优先搜索,BFS)通常使用队列来辅助。对于非叶子节点,我们需要计算每个节点作为根的子树有多少非叶子节点。这里有一个简单的算法:
1. 创建一个空队列,并将根节点入队。
2. 初始化一个计数器 `nonLeafNodesCount = 0`。
3. 当队列非空时,执行以下操作:
a. 弹出队首元素,这是一个节点。
b. 如果该节点不是叶节点(即左右孩子都不为空),则计数器加一。
c. 将该节点的左右孩子(如果存在)依次入队。
4. 遍历结束后,`nonLeafNodesCount` 就是整个树中非叶子节点的数量。
下面是一个简单的C函数示例,实现了这个过程:
```c
int countNonLeafNodes(TreeNode* root) {
if (root == NULL) return 0;
queue<TreeNode*> q;
q.enqueue(root);
int nonLeafNodesCount = 0;
while (!q.isEmpty()) {
TreeNode* node = q.dequeue();
if (node->left && node->right) nonLeafNodesCount++;
if (node->left) q.enqueue(node->left);
if (node->right) q.enqueue(node->right);
}
return nonLeafNodesCount;
}
```
阅读全文