📌  相关文章
📜  来自源节点的树中每个节点的级别(使用 BFS)(1)

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

用BFS确定来自源节点的树中每个节点的级别

BFS是一种常用的图遍历算法,它从一个源节点开始遍历,逐层地遍历它的相邻节点。本题的目标是确定来自源节点的树中每个节点的级别。

定义

树是一种具有层次关系的非线性数据结构,它由一个根节点和若干子树组成。在本题中,我们假设源节点是根节点,每个节点包含一个值和指向它的所有子节点的指针。我们需要确定每个节点在树中的层数(即级别),其中根节点的层数为0,它的子节点的层数为1,依此类推。

算法思路

我们可以使用BFS算法来确定每个节点的级别。具体的算法思路如下:

  1. 初始化一个队列,将源节点入队,并将其级别设为0。
  2. 每次从队列中取出一个节点,将它的所有子节点入队,并将它们的级别设为当前节点的级别加1。
  3. 如果队列为空,则遍历结束。

下面是用示例代码实现BFS的过程:

struct TreeNode {
    int val;
    vector<TreeNode*> children;
    TreeNode(int x) : val(x) {}
};

vector<int> getLevelOrder(TreeNode* root) {
    vector<int> levels;

    if (root == nullptr) {
        return levels;
    }

    queue<pair<TreeNode*, int>> q;
    q.push({root, 0});

    while (!q.empty()) {
        auto node = q.front().first;
        int level = q.front().second;
        q.pop();

        levels.push_back(level);

        for (auto child : node->children) {
            q.push({child, level + 1});
        }
    }

    return levels;
}
时间复杂度

BFS算法的时间复杂度为O(n),其中n是树中节点的个数。因为每个节点只会被遍历一次,所以时间复杂度为线性的。

空间复杂度

空间复杂度取决于队列的大小,最坏情况下,队列的大小会达到树的最大宽度。因此,空间复杂度为O(w),其中w是树的最大宽度。