此前写过一篇二叉树的基础创建与各种遍历(先,中,后),然而我们经常用到二叉树的层序遍历,即从左至右一层一层的输出节点。
算法思路:将根节点放入一队列中,输出根节点,然后判断根节点是否有左右孩子,有则继续放入队列,依次输出队列的元素。
我们引用上次的代码,改一下遍历的函数。
#include<iostream>
#include<queue>
#define Max 50
using namespace std;
//先序和中序建树
typedef struct Tree *BinTree;
struct Tree{
int data;
BinTree lchild;
BinTree rchild;
};
BinTree Create(int pre[],int in[],int len){
BinTree t;
int i = 0;
if(!len)
return NULL;
else{
t = (BinTree)malloc(sizeof(struct Tree));
t->data = pre[0];
for(i;i<len;i++){
if(in[i] == pre[0])
break;
}
t->lchild = Create(pre+1,in,i);
t->rchild = Create(pre+i+1,in+i+1,len-i-1);
}
return t;
}
//层序遍历二叉树
void outOfLevel(BinTree T){
queue<BinTree> rel;
rel.push(T);
while(!rel.empty()){
BinTree front = rel.front();//取出第一个元素
rel.pop();//释放第一个元素
cout<<front->data<<' ';
if(front->lchild!=NULL)
rel.push(front->lchild);
if(front->rchild!=NULL)
rel.push(front->rchild);
}
}
int main(){
int n;//节点数
BinTree T;
int pre[Max],in[Max];//先序和中序的序列
cin>>n;
for(int i = 0;i<n;i++)
cin>>pre[i];
for(int j = 0;j<n;j++)
cin>>in[j];
T = Create(pre,in,n);
outOfLevel(T);
return 0;
}