题目11:111. 二叉树的最小深度
同类题目
前置知识
- 无
题目描述
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:2
示例 2:
输入:root = [2,null,3,null,4,null,5,null,6]
输出:5
提示:
- 树中节点数的范围在
[0, 10^5]
内 -1000 <= Node.val <= 1000
思路分析
本题使用遍历的思想来求解,递归进行遍历,遇到叶子节点时记录最小值。
深度遍历:需要将所有叶子节点都遍历完,才能找到最小值,并不是最优的。
程序代码
方法一:使用一个全局变量记录最小深度
//https://leetcode.cn/problems/minimum-depth-of-binary-tree/
//111. 二叉树的最小深度
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution {
private:
int minDep = 100001;
public:
void travel(TreeNode* root,int depth)
{
if(root == nullptr)
{
minDep = 0;
return ;
}
if(root->left == nullptr && root->right == nullptr)
{
minDep = min(minDep,depth);
return;
}
if(root->left)
travel(root->left,depth + 1);
if(root->right)
travel(root->right,depth + 1);
}
int minDepth(TreeNode* root) {
travel(root,1);
return minDep;
}
};
复杂度分析
时间复杂度:O(n),其中 n 是二叉树中的节点个数。每个节点都会遍历一次。
空间复杂度:O(n),其中 n 是二叉树中的节点个数。递归栈的开销,极限情况树是链状的高度为O(N)。
程序代码
方法二:广度优先遍历,按照层进行遍历,在找到第一个叶子节点时,就可以返回了。
class Solution {
public:
int travel(TreeNode* root)
{
if(root == nullptr)
{
return 0;
}
int depth = 1;
queue<TreeNode*> que;
que.emplace(root);
while(!que.empty())
{
int s = que.size();
for(int i=1;i<=s;i++)
{
TreeNode * cur = que.front();
que.pop();
if(cur->left == nullptr && cur->right == nullptr)
{
return depth;
}
if(cur->left!=nullptr)
{
que.emplace(cur->left);
}
if(cur->right!=nullptr)
{
que.emplace(cur->right);
}
}
// 每下一层,深度加1
depth ++;
}
return depth;
}
int minDepth(TreeNode* root) {
return travel(root);
}
};
复杂度分析
时间复杂度:O(N),其中 N 是树的节点数。对每个节点访问一次。
空间复杂度:O(N),其中 N 是树的节点数。开了一个队列来存储元素,最大值不会超过树的节点数。
题目感悟
遇到题目要考虑一下使用广度还是深度会更优。
更多相关知识:github.com/pingguo1987…