用c语言编写代码 求二叉树节点所在层
时间: 2024-10-27 07:10:37 浏览: 7
在C语言中,我们可以使用队列数据结构来遍历二叉树并找到每个节点所在的层数。这里有一个基本的示例,展示了如何使用递归和辅助队列来完成这个任务:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 向队列添加节点,并返回队列大小
int addTreeNodeToQueue(TreeNode* node, int level, Queue* queue) {
if (node == NULL) return 0;
// 如果队列为空或者当前节点的层次比队首节点大,则入队
if (queue->size == 0 || queue->front->level < level) {
queue->data[queue->size] = (void*)node;
queue->size++;
queue->rear->next = (void*)&queue->data[queue->size - 1];
queue->rear = &queue->data[queue->size - 1];
node->level = level;
} else {
node->level = queue->front->level + 1;
}
addTreeNodeToQueue(node->left, level + 1, queue);
addTreeNodeToQueue(node->right, level + 1, queue);
return queue->size;
}
// 创建空队列
struct Queue {
int size;
void** data;
struct Node* front, *rear;
};
// 初始化队列
Queue* createQueue() {
Queue* q = malloc(sizeof(Queue));
q->size = 0;
q->data =malloc(50 * sizeof(void*)); // 假设最多50个节点
q->front = q->rear = (void**)&q->data[0];
return q;
}
// 删除队头元素并释放内存
void deleteQueue(Queue* q) {
free(q->data);
free(q);
}
// 示例主函数
void printTreeLevel(TreeNode* root) {
Queue* queue = createQueue();
if (root != NULL)
addTreeNodeToQueue(root, 1, queue);
while (queue->size > 0) {
TreeNode* node = (TreeNode*)queue->front;
printf("Node value: %d, Level: %d\n", node->val, node->level);
queue->front = queue->front->next; // 移除队头元素
if (node->left) addTreeNodeToQueue(node->left, node->level + 1, queue);
if (node->right) addTreeNodeToQueue(node->right, node->level + 1, queue);
}
deleteQueue(queue);
}
// 测试用法
int main() {
// 插入节点构建二叉树...
// 这里省略实际创建二叉树的代码
TreeNode* root = ...;
printTreeLevel(root);
return 0;
}
```
阅读全文