111.二叉树的最小深度
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:2
示例 2:
输入:root = [2,null,3,null,4,null,5,null,6]
输出:5
来源:力扣(LeetCode)
链接:https:///problems/minimum-depth-of-binary-tree
/**
* Definition for a binary tree node.
* 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*> q;
if(root==nullptr){
return 0;
}
q.push(root);
int depth=1;
int size=q.size();
while(!q.empty()){
int size=q.size();
for(int i=0;i<size;i++){
TreeNode* cur=q.front();
q.pop();
if(cur->left==nullptr && cur->right==nullptr){
return depth;
}
if(cur->left){
q.push(cur->left);
}
if(cur->right){
q.push(cur->right);
}
}
depth++;
}
return depth;
}
};
代码是一个二叉树的最小深度计算函数minDepth
的实现。这个函数计算二叉树的最小深度,即从根节点到最近的叶子节点的最短路径上的节点数。
以下是代码的分解说明:
-
函数
minDepth
接受一个指向二叉树根节点的指针作为输入,并返回一个整数,表示二叉树的最小深度。 -
首先创建一个存储
TreeNode*
类型的队列,用于对树进行层次遍历。如果根节点为空(即空树),函数返回0。 -
将根节点入队,并将深度初始化为1。
-
使用变量
size
来跟踪当前层级的节点数量,初始时设置为队列的大小。 -
主要的while循环在队列为空之前一直执行。在循环内部,声明一个新变量
size
来存储当前层级的节点数量,并在每次while循环迭代时更新该值。 -
使用for循环来处理当前层级的所有节点,循环
size
次。 -
在每次for循环迭代中,从队列的前端移除节点(
cur
)。如果该节点没有左子节点和右子节点,则说明它是一个叶子节点。在这种情况下,将当前深度作为最小深度返回。 -
如果当前节点有左子节点,则将其入队。
-
如果当前节点有右子节点,则也将其入队。
-
在处理完当前层级的所有节点之后,将深度增加1。
-
最后,当while循环结束且队列中没有更多节点时,函数返回深度,表示二叉树的最小深度。
总体而言,该代码使用队列执行二叉树的层次遍历,并通过计算层级直到遇到叶子节点来确定最小深度。
使用深度优先进行遍历
class Solution {
public:
int minDepth(TreeNode* root) {
if (root == nullptr) {
return 0;
}
if (root->left == nullptr && root->right == nullptr) {
return 1;
}
int minDep = INT_MAX;
if (root->left) {
minDep = min(minDep, minDepth(root->left));
}
if (root->right) {
minDep = min(minDep, minDepth(root->right));
}
return minDep + 1;
}
};