描述
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:2
示例 2:输入:root = [2,null,3,null,4,null,5,null,6]
输出:5提示:
树中节点数的范围在 [0, 105] 内
-1000 <= Node.val <= 1000
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-depth-of-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
C++代码
1、深度优先搜索
二叉树的经典问题之最小深度问题就是就最短路径的节点个数,还是用深度优先搜索 DFS 来完成,万能的递归啊。首先判空,若当前结点不存在,直接返回0。然后看若左子结点不存在,那么对右子结点调用递归函数,并加1返回。反之,若右子结点不存在,那么对左子结点调用递归函数,并加1返回。若左右子结点都存在,则分别对左右子结点调用递归函数,将二者中的较小值加1返回即可
/**
* 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) {
//1、空树
if(!root) return 0;
//2、左子树为空
if(!root->left) return minDepth(root->right) + 1;
//3、右子树为空
if(!root->right) return minDepth(root->left) + 1;
//4、左右子树都非空
return 1 + min(minDepth(root->left), minDepth(root->right));
}
};
2、广度优先搜索
我们也可以是迭代来做,层序遍历,记录遍历的层数,一旦遍历到第一个叶结点,就将当前层数返回,即为二叉树的最小深度
class Solution {
public:
int minDepth(TreeNode* root) {
if(!root) return 0; //
int res = 0; // 保存结果
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
res++; // 每层加一
int n = q.size();
for(int i=0; i<n; i++){
auto node = q.front();
q.pop();
if(!node->left && !node->right) return res; // 遍历到叶结点时终止
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
}
return res;
}
};
Python代码
1、DFS
class Solution:
def minDepth(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
if not root.left:
return self.minDepth(root.right)+1
if not root.right:
return self.minDepth(root.left)+1
res = min(self.minDepth(root.left), self.minDepth(root.right)) + 1
return res
2、BFS
class Solution:
def minDepth(self, root: Optional[TreeNode]) -> int:
res = 0
if not root:
return res
q = [root]
while q:
res += 1
n = len(q)
for i in range(n):
node = q.pop(0)
if not node.left and not node.right:
return res
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
return res