题目描述:
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:2
示例 2:
输入:root = [2,null,3,null,4,null,5,null,6] 输出:5
提示:
- 树中节点数的范围在
[0, 105]
内 -1000 <= Node.val <= 1000
题解:
解法一:递归算法
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
//思路:递归返回根节点左右子树的最小深度
//判断最小: 深度最小且该子树必须存在,即深度不能为1
int returnDeep(struct TreeNode* root)
{
if(root==NULL)
return 0;
else
{
int leftDeep=returnDeep(root->left)+1;
int rightDeep=returnDeep(root->right)+1;
if(( leftDeep ==1 )||(leftDeep == rightDeep))
return rightDeep;
else if( rightDeep == 1 )
return leftDeep;
else
return rightDeep < leftDeep ? rightDeep : leftDeep;
}
}
int minDepth(struct TreeNode* root) {
int res=returnDeep(root);
return res;
}
解法二:非递归算法--DFS+队列(重点掌握)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
//思路: 采用队列+广度优先遍历BFS
//判断最小: 由于是BFS,当遍历到叶子节点时(当前结点的左右子树均不存在),直接返回当前结点深度即可
#define NUM 10000
int minDepth(struct TreeNode* root)
{
if(root == NULL)
{
return 0;
}
int front = 0;
int rear = 0;
struct TreeNode *Q[NUM];//创建队列
struct TreeNode *node;
int depth = 1;
int QueneNum = 0; //队列中的元素数量
Q[rear++] = root;//初始化队列
while(rear != front)
{
QueneNum = rear - front; //获取当前队列中的元素数量
for(int i = 0 ; i < QueneNum ; i++) //遍历当前队列中的所有元素,QueueNum作为遍历次数的标志2
{
node = Q[front++]; //出队
//访问其左右子树
if( !node->left && !node->right ) //若左右子树均不存在,直接返回当前结点深度
return depth;
if( node->left ) //若左子树存在,入队
Q[rear++] = node->left;
if( node->right ) //若右子树存在,入队
Q[rear++] = node->right;
}
depth++; //没有发生返回,则当前结点不是叶子结点,更新深度
}
return depth;
}