希赛考试网
首页 > 软考 > 信息系统管理工程师

二叉树层序遍历

希赛网 2023-11-11 16:38:04

二叉树是一种常见的数据结构,在计算机科学中有着广泛的应用。二叉树层序遍历是指按层从上到下,从左到右的顺序遍历二叉树。本文主要从多个角度分析二叉树层序遍历。

定义

二叉树层序遍历是将二叉树从上到下、从左到右依次遍历每个节点的方法。层序遍历可以用队列实现,先将根节点加入队列,每次从队列中取出一个节点,输出节点的值,并将其左右子节点加入队列。直到队列为空,遍历结束。

算法实现

二叉树的层序遍历可以用队列实现。使用一个队列来存储待遍历的节点,首先将根节点入队,然后进入循环,每次从队列头部取出一个节点并输出值,然后将该节点的左右孩子分别入队。当队列为空时,遍历结束。

以下是二叉树层序遍历的代码实现:

```

struct TreeNode {

int val;

TreeNode *left;

TreeNode *right;

TreeNode(int x) : val(x), left(NULL), right(NULL) {}

};

vector > levelOrder(TreeNode* root) {

vector > res;

if (!root) {

return res;

}

queue q;

q.push(root);

while (!q.empty()) {

int size = q.size();

vector level;

for (int i = 0; i < size; i++) {

auto node = q.front();

q.pop();

level.push_back(node->val);

if (node->left) {

q.push(node->left);

}

if (node->right) {

q.push(node->right);

}

}

res.push_back(level);

}

return res;

}

```

复杂度分析

假设二叉树共有n个节点,二叉树层序遍历需要遍历每个节点一次,因此时间复杂度为O(n)。使用队列存储节点的空间复杂度为O(n),同时需要额外的空间存储结果,因此空间复杂度为O(n)。

优化

对于二叉树层序遍历,可以使用两个队列实现。具体实现方式是维护两个队列:一个存储当前层中的节点,另一个存储下一层的节点。进入循环后,首先从队列1中取出一个节点,输出节点的值,并将其左右孩子分别放入队列2。当队列1为空时,说明当前层已经遍历完毕,进入下一层的遍历。这时将队列2赋值给队列1,并新建一个空的队列2,用于存储下一层的节点。如此反复,直到所有节点都被遍历完。

以下是使用两个队列实现二叉树层序遍历的代码实现:

```

vector > levelOrder(TreeNode* root) {

vector > res;

if (!root) {

return res;

}

queue q1, q2;

q1.push(root);

while (!q1.empty()) {

vector level;

while (!q1.empty()) {

auto node = q1.front();

q1.pop();

level.push_back(node->val);

if (node->left) {

q2.push(node->left);

}

if (node->right) {

q2.push(node->right);

}

}

res.push_back(level);

swap(q1, q2);

}

return res;

}

```

该实现方式的时间复杂度和空间复杂度与上述实现方式相同,但是可以有效减少额外的空间开销,提高算法效率。

应用场景

二叉树层序遍历广泛应用于树的遍历、搜索和图论等领域。常见的应用场景包括:

1. 求二叉树的高度或深度:在层序遍历时,记录每一层的节点个数,并依次遍历每一层。最后遍历结束时,得到二叉树的高度或深度。

2. 判断二叉树是否完全二叉树:在层序遍历时,如果遇到一个节点的左孩子为空,右孩子非空,则该二叉树不是完全二叉树。

3. 二叉树的最大宽度:在层序遍历时,记录每一层的最大宽度,最后取其最大值即可。

扫码咨询 领取资料


软考.png


信息系统管理工程师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
信息系统管理工程师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考资格查询系统

扫一扫,自助查询报考条件