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