📅  最后修改于: 2023-12-03 15:26:09.055000             🧑  作者: Mango
本文将介绍树的遍历中的问题6,以及解决该问题的方法。
给定一棵二叉树,找到其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
由于要计算最小深度,我们可以使用 DFS(深度优先搜索) 来解决这个问题。在树的深度遍历中,我们需要在遍历左子树和右子树时取其最小值,然后加上根节点的深度。
具体而言,当节点为空时,返回0;当当前节点没有左、右子树时,返回当前节点的深度。否则,遍历左子树和右子树,并取其最小值,再加上根节点的深度。
int minDepth(TreeNode* root) {
if (root == NULL) return 0;
if (root->left == NULL && root->right == NULL) return 1;
int left_min_depth = minDepth(root->left);
int right_min_depth = minDepth(root->right);
if (left_min_depth == 0) return right_min_depth + 1;
if (right_min_depth == 0) return left_min_depth + 1;
return min(left_min_depth, right_min_depth) + 1;
}
除了 DFS,BFS(广度优先搜索)也可以解决该问题。我们将节点按层级遍历,并在遍历过程中计算每一层的深度,直到遇到第一个叶子节点。
具体而言,当树为空时,返回0。否则,将第一层节点插入队列中,并设置深度为1。接着,进入循环:
int minDepth(TreeNode* root) {
if (root == NULL) return 0;
queue<TreeNode*> q{{root}};
int d = 0;
while (!q.empty()) {
++d;
for (int i = q.size(); i > 0; --i) {
TreeNode* t = q.front(); q.pop();
if (t->left == NULL && t->right == NULL) return d;
if (t->left != NULL) q.push(t->left);
if (t->right != NULL) q.push(t->right);
}
}
return -1;
}
此篇文章介绍了如何计算一棵二叉树的最小深度。DFS 和 BFS 都可以解决这个问题,BFS 的效率可能会更高一些。实际应用中,选择什么方法取决于具体情况。