30、给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径的节点数量。
返回他的最小深度2。
思路
递归来创建树,并且在创建完毕之后,递归计算树的深度,同时最后使用了三目运算符来一次比较取出最小值,当然也可以取出最大值即求树高。
具体实现
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结构体
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
// 计算最小深度函数
int minDepth(struct TreeNode* root) {
if (root == NULL) {
return 0; // 如果树为空,深度为0
} else if (root->left == NULL && root->right == NULL) {
return 1; // 如果节点没有子节点,深度为1
} else if (root->left == NULL) {
return minDepth(root->right) + 1; // 如果左子树为空,递归计算右子树深度
} else if (root->right == NULL) {
return minDepth(root->left) + 1; // 如果右子树为空,递归计算左子树深度
} else {
// 如果左右子树均不为空,递归计算左右子树深度,取较小值加1
int leftDepth = minDepth(root->left);
int rightDepth = minDepth(root->right);
return (leftDepth < rightDepth ? leftDepth : rightDepth) + 1;
}
}
// 创建二叉树函数(根据用户输入)
struct TreeNode* createTree() {
int val;
printf("请输入值(-1为空): ");
scanf("%d", &val);
if (val == -1) {
return NULL;
} else {
struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->val = val;
printf("%d的左孩子:\n", val);
node->left = createTree();
printf("%d的又孩子:\n", val);
node->right = createTree();
return node;
}
}
int main() {
struct TreeNode* root = createTree();
int min_depth = minDepth(root);
printf("树的最小高度是: %d\n", min_depth);
return 0;
}
小结
对于树的算法来说,使用递归遍历确实是最简便也最容易实现的一种方法,但是可能会造成栈满的情况。