[蓝蓝计算机考研算法训练二]-day21

152 阅读1分钟

30、给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径的节点数量。

image.png

返回他的最小深度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;
}

image.png

小结

对于树的算法来说,使用递归遍历确实是最简便也最容易实现的一种方法,但是可能会造成栈满的情况。