这个算法的思想是基于队列的层次遍历。层次遍历是一种广度优先搜索(BFS)的算法,它按层级顺序逐层遍历树或图的节点。
层次遍历算法的基本思想是通过使用队列,按照从上到下、从左到右的顺序访问每个节点。具体步骤如下:
- 创建一个空队列,并将根节点入队。
- 当队列非空时,重复以下步骤:
- 从队列中取出一个节点。
- 访问该节点,可以根据需求进行相应的操作,例如打印节点值。
- 将该节点的左子节点和右子节点依次入队。
- 循环结束后,即完成了树或图的层次遍历。
这个算法的关键在于使用队列来保存每一层的节点,并按照从左到右的顺序逐层访问。通过不断将节点的子节点入队,保证了每一层的节点按顺序访问,从而实现了层次遍历的效果。
层次遍历算法的时间复杂度是 O(N),其中 N 是树或图中节点的数量。因为每个节点都会被访问一次,并且每个节点都会被入队和出队一次。层次遍历算法广泛应用于树和图的遍历问题,特别适用于需要按层级顺序处理节点的场景,如查找树的最小深度、查找树的最大宽度等。
#include <iostream>
#include <queue>
using namespace std;
// 二叉树节点结构
struct TreeNode {
int data; // 节点数据
struct TreeNode* lchild; // 左子节点指针
struct TreeNode* rchild; // 右子节点指针
};
typedef struct TreeNode* bitree; // 定义二叉树指针类型
typedef queue<bitree> Queue; // 定义队列类型
void visited(bitree node) {
cout << node->data << " "; // 输出节点数据
}
void initqueue(Queue& q) {
while (!q.empty()) {
q.pop(); // 清空队列
}
}
void enqueue(Queue& q, bitree item) {
q.push(item); // 入队操作
}
void dequeue(Queue& q, bitree& item) {
item = q.front(); // 获取队头节点
q.pop(); // 出队操作
}
bool isempty(Queue& q) {
return q.empty(); // 判断队列是否为空
}
void levelorder(bitree t) {
bitree p;
Queue q;
initqueue(q); // 初始化队列
enqueue(q, t); // 将根节点入队
while (!isempty(q)) {
dequeue(q, p); // 出队一个节点
visited(p); // 访问节点
if (p->lchild != NULL)
enqueue(q, p->lchild); // 将左孩子入队
if (p->rchild != NULL)
enqueue(q, p->rchild); // 将右孩子入队
}
}
// 创建新节点
bitree createNode(int data) {
bitree newNode = new TreeNode;
newNode->data = data;
newNode->lchild = NULL;
newNode->rchild = NULL;
return newNode;
}
// 创建二叉树
bitree createBinaryTree() {
bitree root = createNode(1);
root->lchild = createNode(1);
root->rchild = createNode(3);
root->lchild->lchild = createNode(5);
root->lchild->rchild = createNode(5);
root->rchild->lchild = createNode(6);
root->rchild->rchild = createNode(7);
return root;
}
int main() {
bitree root = createBinaryTree();
cout << "层次遍历结果:";
levelorder(root);
cout << endl;
return 0;
}