给定一棵非空二叉树,数据域值为不等于0的整数。请编写程序找出其最深层间隔最远的两个结点,输出这两个结点差的绝对值。如图1所示的各二叉树最深层间隔最远的结点为5和8。如果最深层只有一个结点,则输出0。用c语言写
时间: 2024-10-09 15:04:10 浏览: 29
在C语言中,你可以使用递归的方式来解决这个问题。首先,我们需要定义一个结构体表示二叉树节点,然后创建一个辅助函数来找到每层的最大值和最小值。最后,主函数会遍历整个树并计算深度最大值之间的差异。
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 辅助函数,用于查找每层的最大值和最小值
void findMinMax(TreeNode* node, int level, int* max_val, int* min_val) {
if (node == NULL) return;
// 更新当前层的最大值和最小值
if (level > *max_val[0]) {
*max_val = malloc(sizeof(int) * (level + 1));
(*max_val)[level] = node->val;
*min_val = malloc(sizeof(int) * (level + 1));
(*min_val)[level] = node->val;
} else if (node->val > (*max_val)[level]) {
(*max_val)[level] = node->val;
} else if (node->val < (*min_val)[level]) {
(*min_val)[level] = node->val;
}
// 递归处理左右子树
findMinMax(node->left, level + 1, max_val, min_val);
findMinMax(node->right, level + 1, max_val, min_val);
}
// 主函数,寻找最深层间隔最远的节点
int farthestDistance(TreeNode* root) {
int max_depth = 0;
int** max_val = malloc(sizeof(int*) * 2); // 存储每层最大值
int** min_val = malloc(sizeof(int*) * 2); // 存储每层最小值
// 初始化最大值数组
for (int i = 0; i <= 2; i++) {
max_val[i] = min_val[i] = NULL;
}
// 找到最大深度和对应的最大值、最小值
findMinMax(root, 0, max_val, min_val);
max_depth = *max_val[0] != 0 ? *max_val[0] : 1; // 如果根节点不是0,最大深度为1
// 计算最深层间隔
int result = 0;
if (max_depth > 1) {
for (int i = 1; i < max_depth; i++) {
if ((*max_val)[i] != (*min_val)[i]) {
result = MAX(result, abs((*max_val)[i] - (*min_val)[i]));
}
}
}
free(max_val[0]);
free(min_val[0]);
free(max_val);
free(min_val);
return result;
}
// 示例:创建一个二叉树实例
TreeNode* createTree() {
// ... 创建二叉树的代码 ...
}
int main() {
TreeNode* root = createTree();
int distance = farthestDistance(root);
printf("The farthest distance between nodes in the deepest level is %d.\n", distance);
return 0;
}
```
在这个示例中,你需要自定义`createTree`函数来构建你想要测试的具体二叉树。注意,由于树的结构复杂,这里只给出了基本的框架和思路,具体的细节需要你自己实现。如果你遇到任何问题,可以随时提问相关的
阅读全文