【数据结构】C/C++实现二叉树的层序遍历
题目
思路
- 层序遍历的意思是一层一层地遍历树,即BFS。BFS用队列来维护。
- 先将根节点放进队列中。
- 每次从队列中取出一个结点,访问它。
- 遍历它的孩子结点,并把它们放进队列中。
- 直至队列为空。
举个例子:
- 刚开始将根节点放进队列中,此时队列为【A】。
- 从队列中取出一个元素,为A。输出A。
- 遍历A的所有孩子,将B、C放入队列中。此时队列为【B、C】。
- 从队列中取出一个元素,为B。输出B。
- 遍历B的所有孩子,将D、F放入队列中。此时队列为【C、D、F】。
- 从队列中取出一个元素,为C。输出C。
- 遍历C的所有孩子,将G、I放入队列中。此时队列为【D、F、G、I】。
- ……重复以上①从队列中取一个元素,访问它;②遍历它的所有孩子,并将其放入队列中的动作,直至③队列为空。
代码
void LevelorderTraversal( BinTree BT )
{
int maxn = 1005;
BinTree tree[maxn];
int top, rear;
top = rear = 0;
BinTree tmp;
if(!BT) return;
tree[rear++] = BT;
while(top < rear){
tmp = tree[top];
printf(" %c",tmp->Data);
if(tmp->Left) tree[rear++] = tmp->Left;
if(tmp->Right) tree[rear++] = tmp->Right;
top++;
}
return;
}
- 以上是模拟队列操作。如果是c++,可以直接用STL里的队列queue进行操作。
- 以下给出代码
queue<BinTree> q;
void BFS(BinTree BT){
if(!BT) return;
BinTree bt;
bt = BT;
q.push(bt);
while(!q.empty()){
bt = q.front();
q.pop();
printf("%c ", bt->Data);
if(bt->Left) q.push(bt->Left);
if(bt->Right) q.push(bt->Right);
}
}