题目
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
版本1,BFS
BFS广度优先搜索,利用队列queue实现,遍历每一层的节点,每次向下拓展ans++,当拓展到某个节点没有子节点时,说明找到最短路径,退出两个while循环返回ans。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int minDepth(TreeNode* root) {
if(!root)
return 0;
queue<TreeNode*> qu;
qu.push(root);
int ans=0;
bool f=0;
while(!qu.empty()&&!f)
{
int sz=qu.size();
while(sz--)
{
TreeNode* node=qu.front();
qu.pop();
if(!node->left&&!node->right)
{
f=1;
break;
}
if(node->left)
qu.push(node->left);
if(node->right)
qu.push(node->right);
}
ans++;
}
return ans;
}
};
DFS
深度优先搜索,向下拓展到左子树最底层,从下到上不断比较较小值,返回最短路径,先计算左子树再计算右子树。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int minDepth(TreeNode* root) {
if(root==NULL)
return 0;
if(!root->left&&!root->right)
return 1;
int ans=INT_MAX;
if(root->left)
ans=min(minDepth(root->left),ans);
if(root->right)
ans=min(minDepth(root->right),ans);
return ans+1;
}
};