给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
参考二叉树的最大深度,传送门:
https://blog.csdn.net/CLZHIT/article/details/111118994
参考来自微信公众号代码随想录的文章:
二叉树的最小深度
解法一:递归解法
求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。
class Solution {
public:
int minDepth(TreeNode* root) {
// if(root == nullptr)
// {
// return 0;
// }
// return process1(root, 1);
return process2(root);
}
int process1(TreeNode* root, int level)
{
if(!root->left && !root->right) return level;
int res = INT_MAX;
if(root->left) res = min(res, process1(root->left, level+1));
if(root->right) res = min(res, process1(root->right, level+1));
return res;
}
int process2(TreeNode* root)
{
if(root == nullptr) return 0;
int leftDepth = process2(root->left);
int rightDepth = process2(root->right);
if(!root->left && root->right) return 1+rightDepth;
if(!root->right && root->left) return 1+leftDepth;
int result = 1 + min(leftDepth, rightDepth);
return result;
}
};
解法二:非递归解法
需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。如果其中一个孩子为空则不是最低点。
class Solution {
public:
int minDepth(TreeNode* root) {
int depth = 0;
queue<TreeNode*> que;
vector<int> level;
int flag = false;
if(root != nullptr) que.push(root);
while(!que.empty())
{
depth++;
int size = que.size();
for(int i = 0; i < size; i++)
{
TreeNode* tmpNode = que.front();
que.pop();
if(tmpNode->left) que.push(tmpNode->left);
if(tmpNode->right) que.push(tmpNode->right);
if(!tmpNode->left && !tmpNode->right) flag = true;
}
if(flag) break;
}
return depth;
}
};