请设计一个算法,实现求给定二叉树每一层结点最小值的功能。该算法对应的C语言函数 声明如下:int* smallestValues(struct TreeNode* root, int* returnS
时间: 2024-10-28 11:12:01 浏览: 21
二叉树建立遍历冒泡排序快速排序算法:C语言编程实现10个数据结构课程设计实例.zip
为了实现这个功能,你可以采用层次遍历(BFS,即广度优先搜索)策略来找到每层节点的最小值。以下是一个C语言函数的设计,它会返回一个整数数组,数组中的元素表示从根节点开始到最底层节点的最小值:
```c
#include <stdio.h>
#include <stdlib.h>
#include <queue>
// 结构体定义二叉树节点
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
// 函数声明
int* smallestValues(struct TreeNode* root, int* returnSize);
// 辅助函数用于递归计算当前层的最小值
void getMin(int* arr, int level, struct TreeNode* node, int* minSoFar) {
if (node != NULL) {
if (*minSoFar > node->val) {
*minSoFar = node->val;
}
// 如果不是最后一层,添加当前节点值并继续向下探索
if (level < *returnSize - 1) {
arr[level] = node->val;
getMin(arr + level + 1, level + 1, node->left, minSoFar);
getMin(arr + level + 1, level + 1, node->right, minSoFar);
} else {
// 最后一层,直接将剩余空间填入节点值
while (*returnSize > level) {
arr[level] = node->val;
++level;
--*returnSize;
}
}
}
}
// 主函数,计算最小值并返回结果数组
int* smallestValues(struct TreeNode* root, int* returnSize) {
if (root == NULL) {
return NULL; // 如果根节点为空,返回NULL
}
int size = 0; // 初始化数组大小
queue<int> q; // 使用队列辅助层次遍历
q.push(root); // 将根节点加入队列
while (!q.empty()) {
int levelNodes = q.size(); // 当前层节点数量
int* layerMin = (int*)malloc(sizeof(int) * levelNodes); // 分配新层的存储空间
*returnSize += levelNodes;
// 遍历当前层并将最小值存入数组
while (levelNodes--) {
struct TreeNode* node = q.front();
q.pop();
getMin(layerMin, 0, node, &layerMin[0]);
}
// 更新最小值数组,并将当前层的节点放入下一层队列
for (int i = 0; i < levelNodes; ++i) {
q.push(layerMin[i]);
}
free(layerMin); // 释放当前层的内存
}
// 返回最小值数组
return (int*)malloc(*returnSize * sizeof(int));
}
// 示例用法
int main() {
// 创建一个示例二叉树并调用函数
// 填充结构体、创建根节点、设置数据...
struct TreeNode* root = ...;
int size;
int* result = smallestValues(root, &size);
// 输出结果并清理内存
for (int i = 0; i < size; ++i) {
printf("%d ", result[i]);
}
free(result);
return 0;
}
```
阅读全文