《编程之美》有一题是
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
struct Node
{
int x;
Node *l,*r;
Node(int n):x(n)
{
l=NULL;
r=NULL;
}
};
//输入1 2 4 0 0 5 7 0 0 8 0 0 3 0 6 0 0
void build(Node *&tree)
{
int x;
cin>>x;
if(x!=0)//这里不能使用字母比如q来判断结尾char int
{
tree=new Node(x);
build(tree->l);
build(tree->r);
}
else
{
tree=NULL;
}
}
//先序遍历
void print(Node *tree)
{
if(!tree)
return;
cout<<tree->x<<' ';
print(tree->l);
print(tree->r);
}
//层次遍历
void levelPrint(Node *tree)
{
queue<Node *> q;
Node *node=NULL;
if(!tree)
return;
else
q.push(tree);
while(!q.empty() )
{
//node=q.pop(); //pop删除元素,无返回值
node=q.front();
q.pop();
cout<<node->x<<'\t';
if(node->l)
q.push(node->l);
if(node->r)
q.push(node->r);
}
cout<<endl;
}
//层次遍历,并且每层换行
void levelPrint2(Node *tree)
{
if(!tree)
return;
Node *q[20]; //不会自动初始化为NULL
int i=0,j=1,k=1;//i表示当前位置,j表示下一层第一个位置,每换一层用k记录末位
q[0]=tree;
while(i!=j)
{
if(i==k)
{
cout<<endl;
k=j;
}
cout<<q[i]->x;
if(q[i]->l)
q[j++]=q[i]->l;
if(q[i]->r)
q[j++]=q[i]->r;
i++;
}
}
int main()
{
Node *t=NULL;
build(t);
print(t);
cout<<endl;
levelPrint2(t);
return 0;
}