层序遍历
#include<iostream>
#include<vector>
using namespace std;
struct node
{
int data;
node *lchild,*rchild;
};
void createBinaryTree(node *&root)
{
int i;
cin>>i;
if(i==0)root=NULL;
else
{
root=new node;
root->data=i;
createBinaryTree(root->lchild);
createBinaryTree(root->rchild);
}
}
int printNodeAtLevel(node *root,int k)
{
if(!root||k<0)return 0;
if(k==0)
{
cout<<root->data<<' ';
return 1;
}
return printNodeAtLevel(root->lchild,k-1)+printNodeAtLevel(root->rchild,k-1);
}
void levelorderTraversal1(node *root)
{
for(int k=0;;++k)
{
if(!printNodeAtLevel(root,k))break;
cout<<endl;
}
}
void levelorderTraversal2(node *root)
{
if(!root)return;
vector<node *> vec;
vec.push_back(root);
int cur=0,last;
while(cur<vec.size())
{
last=vec.size();
while(cur<last)
{
cout<<vec[cur]->data<<' ';
if(vec[cur]->lchild)vec.push_back(vec[cur]->lchild);
if(vec[cur]->rchild)vec.push_back(vec[cur]->rchild);
++cur;
}
cout<<endl;
}
}
//fromLeftToRight=true表示从左到右,fromLeftToRight=false表示从右到左
void levelorderTraversal3(node *root,bool fromLeftToRight)
{
if(!root)return;
vector<node *> vec;
vec.push_back(root);
int cur=0,last;
while(cur<vec.size())
{
last=vec.size();
vec.push_back(NULL);
while(cur<last)
{
if(fromLeftToRight)
{
if(vec[cur]->rchild)vec.push_back(vec[cur]->rchild);
if(vec[cur]->lchild)vec.push_back(vec[cur]->lchild);
}
else
{
if(vec[cur]->lchild)vec.push_back(vec[cur]->lchild);
if(vec[cur]->rchild)vec.push_back(vec[cur]->rchild);
}
++cur;
}
++cur;
}
//反向迭代器
vector<node *>::reverse_iterator riter;
for(riter=vec.rbegin()+1;riter!=vec.rend();++riter)
{
if(*riter)cout<<(*riter)->data<<' ';
else cout<<endl;
}
cout<<endl;
}
int main()
{
node *root;
createBinaryTree(root);
levelorderTraversal1(root);
levelorderTraversal2(root);
levelorderTraversal3(root,true);
levelorderTraversal3(root,false);
return 0;
}