题目描述
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:2
示例 2:
输入:root = [2,null,3,null,4,null,5,null,6]
输出:5
3
/ \
9 20
/ \
15 7
在这棵树中:
节点 3 是根节点。
节点 9, 15, 和 7 都是叶子节点,因为它们没有子节点。
节点 20 是内部节点,因为它有两个子节点。
计算最小深度:
1、从根节点 3 开始,我们考虑所有从根节点到叶子节点的路径:
路径 3 -> 9
路径 3 -> 20 -> 15
路径 3 -> 20 -> 7
2、计算每条路径上的节点数量:
路径 3 -> 9: 两个节点
路径 3 -> 20 -> 15: 三个节点
路径 3 -> 20 -> 7: 三个节点
3、从上述计算中可以看到,最短的路径是 3 -> 9,包含两个节点。
因此,这棵树的最小深度是 2。
思路
为了找出一个二叉树的最小深度,可以通过层序遍历(广度优先搜索)方法来实现。在层序遍历中,我们可以在达到第一个叶子节点时立即返回其深度,这样可以保证找到的是最小深度。这种方法比深度优先搜索(DFS)更为高效,因为它不需要遍历整个树就能找到答案。
minDepth
:
- 使用队列进行层序遍历,每层的节点都被依次处理。
- 如果找到一个叶子节点(即没有子节点的节点),则立即返回当前的深度 depth。
- 如果节点有子节点,这些子节点被加入队列以用于后续的层序遍历。
- 深度 depth 在每完成一层遍历后递增。
完整代码
#include<iostream>
#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 {
public:
int minDepth(TreeNode* root) {
queue<TreeNode*> que;
if(root != NULL) que.push(root);
else return 0;
int depth = 1;
while(!que.empty()){
int size = que.size(); // 当前层的节点个数
for(int i = 0; i <size; i++){
TreeNode* node = que.front();
que.pop();
if(!node->left && !node->right) return depth;
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
depth++;
}
return depth;
}
};
int main()
{
TreeNode* root = new TreeNode(3);
root->left = new TreeNode(9);
root->right = new TreeNode(20);
root->right->left = new TreeNode(15);
root->right->right = new TreeNode(7);
Solution s;
int min = s.minDepth(root);
cout << min << endl;
return 0;
}