用队列实现二叉树的层次遍历算法,并按层次输出(标出层号)
时间: 2023-06-15 20:06:32 浏览: 98
二叉树的层次遍历可以用队列来实现,具体步骤如下:
1. 将根节点入队列
2. 当队列不为空时,进行如下操作:
- 弹出队首节点,将其值输出
- 如果该节点有左子节点,将左子节点入队列
- 如果该节点有右子节点,将右子节点入队列
3. 重复步骤2,直到队列为空
同时,为了按层次输出,我们需要记录当前节点所在的层数。具体实现可以在节点入队列时将该节点的层数作为一个参数传入,并在输出时一并输出。具体实现如下(假设二叉树节点的定义为`struct TreeNode {int val; TreeNode* left; TreeNode* right;};`):
```c++
void levelOrder(TreeNode* root) {
if (root == NULL) return;
queue<pair<TreeNode*, int>> q; // 用 pair 记录节点和层数
q.push(make_pair(root, 0)); // 根节点层数为0
int curLevel = -1; // 当前节点所在的层数
while (!q.empty()) {
TreeNode* curNode = q.front().first;
int curNodeLevel = q.front().second;
q.pop();
if (curNodeLevel != curLevel) { // 如果是新的一层,先输出层号
curLevel = curNodeLevel;
cout << "Level " << curLevel << ": ";
}
cout << curNode->val << " "; // 输出节点值
if (curNode->left != NULL) q.push(make_pair(curNode->left, curNodeLevel+1)); // 左子节点入队列
if (curNode->right != NULL) q.push(make_pair(curNode->right, curNodeLevel+1)); // 右子节点入队列
}
}
```
该算法的时间复杂度为$O(n)$,其中$n$为二叉树的节点数。
阅读全文