leetcode 111.二叉树的最小深度(minimum depth of binary tree)C语言

10 篇文章 0 订阅

leetcode 111.二叉树的最小深度(minimum depth of binary tree)C语言

1.description

https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/submissions/

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

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

说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gMuv2KVB-1590907737662)(C:\Users\Mr.Hou\AppData\Roaming\Typora\typora-user-images\image-20200531144837977.png)]

返回它的最小深度 2.

2.solution

2.1 BFS迭代

// 基于数组队列的BFS迭代法
#define MAX_LEN 10000

int minDepth(struct TreeNode* root){
    if(root == NULL){
        return 0;
    }

    struct TreeNode *queue[MAX_LEN];
    struct TreeNode *p = NULL;
    int head = 0;
    int tail = 0;
    int num = 0;

    queue[tail++] = root;
    num++;

    int level = 0;
    while(num != 0){ // 队不空
        int size = num; // 记录当前层节点个数
        while(size--){
            // 出队
            p = queue[head];
            head++;
            num--;

            if(p->left==NULL && p->right==NULL){
                return level+1;
            }
            
            // 子节点入队
            if(p->left){
                queue[tail++] = p->left;
                num++;
            }

            if(p->right){
                queue[tail++] = p->right;
                num++;
            }
        }
        level++;
    }

    return level;
}

2.2 递归

#define MIN(a, b) ((a) < (b) ? (a) : (b))

int minDepth(struct TreeNode* root){
    if(root==NULL){
        return 0;
    }

    int left_d = minDepth(root->left);
    int right_d = minDepth(root->right);

    // left_d和right_d有一个为0说明对应的一边没有叶子节点, 而题目要求"从根节点到最近叶子节点"的最短路径, 只能返回另外一边的depth了, 其实相当于下面代码的简写版
    // if (left_d==0 && right_d!=0) {
    //     return 1 + right_d;
    // }
    // if (right_d==0 && left_d!=0) {
    //     return 1 + left_d;
    // }
    if(left_d==0 || right_d==0){
        return left_d+right_d+1;
    }

    return MIN(left_d, right_d)+1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值