用 c 语言编写算法求任意二叉树中一条最长的路径,并输出此路径上各结点的值
时间: 2024-03-24 19:35:59 浏览: 49
求二叉树的一条最长路径
好的,以下是使用 C 语言编写的程序,实现了求任意二叉树中一条最长的路径,并输出此路径上各结点的值。
```c
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int value;
struct TreeNode *left;
struct TreeNode *right;
};
// 计算以 root 为根的子树的最大深度
int max_depth(struct TreeNode *root) {
if (root == NULL) return 0;
int left_depth = max_depth(root->left);
int right_depth = max_depth(root->right);
return left_depth > right_depth ? left_depth + 1 : right_depth + 1;
}
// 查找以 root 为根的子树中的最长路径
void find_longest_path(struct TreeNode *root, int *max_path_len, int *max_path[]) {
if (root == NULL) return;
// 计算以当前节点为根的子树的最大深度
int left_depth = max_depth(root->left);
int right_depth = max_depth(root->right);
// 计算经过当前节点的最长路径长度
int path_len = left_depth + right_depth;
if (path_len > *max_path_len) {
// 如果当前路径长度大于已知的最长路径长度,则更新最长路径信息
*max_path_len = path_len;
max_path[0] = &(root->value);
if (root->left) max_path[1] = &(root->left->value);
else max_path[1] = NULL;
if (root->right) max_path[2] = &(root->right->value);
else max_path[2] = NULL;
}
// 递归查找左右子树中的最长路径
find_longest_path(root->left, max_path_len, max_path);
find_longest_path(root->right, max_path_len, max_path);
}
int main() {
// 构造一棵二叉树
struct TreeNode *root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->value = 1;
root->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->left->value = 2;
root->left->left = NULL;
root->left->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->left->right->value = 4;
root->left->right->left = NULL;
root->left->right->right = NULL;
root->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->right->value = 3;
root->right->left = NULL;
root->right->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->right->right->value = 5;
root->right->right->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->right->right->left->value = 6;
root->right->right->left->left = NULL;
root->right->right->left->right = NULL;
root->right->right->right = NULL;
// 查找最长路径
int max_path_len = 0;
int *max_path[3] = { NULL, NULL, NULL };
find_longest_path(root, &max_path_len, max_path);
// 输出最长路径上的各节点的值
printf("最长路径长度:%d\n", max_path_len);
printf("最长路径上的节点值:");
for (int i = 0; i < 3; i++) {
if (max_path[i] == NULL) break;
printf("%d ", *max_path[i]);
}
printf("\n");
return 0;
}
```
程序中定义了一个二叉树的结构体 `TreeNode`,并使用动态内存分配构造了一棵二叉树。其中 `max_depth` 函数用于计算以当前节点为根的子树的最大深度,`find_longest_path` 函数用于查找以当前节点为根的子树中的最长路径。最后,在 `main` 函数中调用 `find_longest_path` 函数,并输出最长路径上各节点的值。
阅读全文