📜  数据结构 |树遍历 |问题 6(1)

📅  最后修改于: 2023-12-03 15:26:09.055000             🧑  作者: Mango

数据结构 | 树遍历 | 问题 6

本文将介绍树的遍历中的问题6,以及解决该问题的方法。

问题描述

给定一棵二叉树,找到其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

解决方法
DFS

由于要计算最小深度,我们可以使用 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;
}
BFS

除了 DFS,BFS(广度优先搜索)也可以解决该问题。我们将节点按层级遍历,并在遍历过程中计算每一层的深度,直到遇到第一个叶子节点。

具体而言,当树为空时,返回0。否则,将第一层节点插入队列中,并设置深度为1。接着,进入循环:

  1. 队列不为空时,弹出队头节点,如果它是叶子节点,则返回这个节点的深度;
  2. 否则,将其非空左右子节点插入队列中,并将它们的深度设置为队头节点的深度加上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 的效率可能会更高一些。实际应用中,选择什么方法取决于具体情况。