用c语言写一个非递归代码,求二叉树的第一条最长路径,并输出此路径各结点的值
时间: 2024-11-03 18:23:49 浏览: 31
在 C 语言中,为了找到二叉树的最长路径(通常是最大深度),我们可以使用层序遍历(广度优先搜索)和队列数据结构。这里是一个非递归的示例代码,假设我们有一个简单的二叉树节点结构:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 遍历函数,返回最长路径长度并存储路径
int longestPath(TreeNode* root) {
if (root == NULL) return 0; // 如果根节点为空,路径长度为0
// 初始化变量
int maxDepth = 0;
int currentDepth = 0;
TreeNode** path = malloc(sizeof(TreeNode*) * (currentDepth + 1));
path[0] = root;
// 使用队列进行层次遍历
Queue q;
queue_init(&q);
queue_enqueue(&q, root);
while (!queue_empty(&q)) {
currentDepth++;
int size = queue_size(&q);
for (int i = 0; i < size; i++) {
TreeNode* node = queue_dequeue(&q);
printf("%d ", node->val); // 输出当前节点值
if (node->left != NULL || node->right != NULL) {
// 如果有子节点,则将子节点加入队列
if (node->left)
queue_enqueue(&q, node->left);
if (node->right)
queue_enqueue(&q, node->right);
}
// 更新最长路径长度
maxDepth = max(maxDepth, currentDepth);
}
}
free(path); // 释放内存
return maxDepth;
}
// 简单的队列操作
struct Queue {
// ... (省略队列的具体实现)
};
void queue_init(Queue* q);
int queue_size(Queue* q);
void queue_enqueue(Queue* q, TreeNode* node);
void queue_dequeue(Queue* q);
// 初始化、大小、入队、出队等其他队列辅助函数...
int main() {
// 假设已经构建了二叉树,然后在这里调用 longestPath 函数
TreeNode* treeRoot = ...;
int longestLength = longestPath(treeRoot);
printf("\n最长路径长度: %d\n", longestLength);
return 0;
}
```
在 `main` 函数中,你需要提供实际的二叉树根节点 `treeRoot`。这个程序会打印出最长路径上所有节点的值,以及最长路径的长度。
阅读全文