数据结构与算法之深入解析“二叉树的最小深度”的求解思路与算法示例
Posted Serendipity·y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法之深入解析“二叉树的最小深度”的求解思路与算法示例相关的知识,希望对你有一定的参考价值。
一、题目要求
- 给定一个二叉树,找出其最小深度。
- 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
- 说明:叶子节点是指没有子节点的节点。
- 示例 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。
二、求解算法
① 深度优先搜索
- 首先可以想到使用深度优先搜索的方法,遍历整棵树,记录最小深度。
- 对于每一个非叶子节点,只需要分别计算其左右子树的最小叶子节点深度,这样就将一个大问题转化为了小问题,可以递归地解决该问题。
- C++ 示例:
class Solution
public:
int minDepth(TreeNode *root)
if (root == nullptr)
return 0;
if (root->left == nullptr && root->right == nullptr)
return 1;
int min_depth = INT_MAX;
if (root->left != nullptr)
min_depth = min(minDepth(root->left), min_depth);
if (root->right != nullptr)
min_depth = min(minDepth(root->right), min_depth);
return min_depth + 1;
;
- Java 示例:
class Solution
public int minDepth(TreeNode root)
if (root == null)
return 0;
if (root.left == null && root.right == null)
return 1;
int min_depth = Integer.MAX_VALUE;
if (root.left != null)
min_depth = Math.min(minDepth(root.left), min_depth);
if (root.right != null)
min_depth = Math.min(minDepth(root.right), min_depth);
return min_depth + 1;
② 广度优先搜索
- 同样,可以想到使用广度优先搜索的方法,遍历整棵树。
- 当找到一个叶子节点时,直接返回这个叶子节点的深度。
- 广度优先搜索的性质保证了最先搜索到的叶子节点的深度一定最小。
- C++ 示例:
class Solution
public:
int minDepth(TreeNode *root)
if (root == nullptr)
return 0;
queue<pair<TreeNode *, int> > que;
que.emplace(root, 1);
while (!que.empty())
TreeNode *node = que.front().first;
int depth = que.front().second;
que.pop();
if (node->left == nullptr && node->right == nullptr)
return depth;
if (node->left != nullptr)
que.emplace(node->left, depth + 1);
if (node->right != nullptr)
que.emplace(node->right, depth + 1);
return 0;
;
- Java 示例:
class Solution
class QueueNode
TreeNode node;
int depth;
public QueueNode(TreeNode node, int depth)
this.node = node;
this.depth = depth;
public int minDepth(TreeNode root)
if (root == null)
return 0;
Queue<QueueNode> queue = new LinkedList<QueueNode>();
queue.offer(new QueueNode(root, 1));
while (!queue.isEmpty())
QueueNode nodeDepth = queue.poll();
TreeNode node = nodeDepth.node;
int depth = nodeDepth.depth;
if (node.left == null && node.right == null)
return depth;
if (node.left != null)
queue.offer(new QueueNode(node.left, depth + 1));
if (node.right != null)
queue.offer(new QueueNode(node.right, depth + 1));
return 0;
以上是关于数据结构与算法之深入解析“二叉树的最小深度”的求解思路与算法示例的主要内容,如果未能解决你的问题,请参考以下文章
代码随想录算法训练营第16天 | ● 104.二叉树的最大深度 559.n叉树的最大深度 ● 111.二叉树的最小深度 ● 222.完全二叉树的节点个数