您的位置:首页 > 其它

Uva 122 Trees on the level

2017-04-13 21:55 411 查看
大意: 给出二叉树,求层次遍历,第一次试着用数组模拟指针建树。

#include <algorithm>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <sstream>
#include <queue>
using namespace std;
#define maxn 2005
struct btnode
{
int v;
int right,left;
btnode(int a,int b = -1,int c = -1)
{
v = a ;  right = b;  left = c;
}
btnode(){}
}b[maxn];

int flag = 1;
int num = 1;
int datanum = 0;
int add(int va,int lorr,int now)
{
b[num] = btnode(va);
if(lorr == 0) b[now].left = num;
else b[now].right = num;
num++;
return 0;
}
int getdata()
{
string s;
for(int i = 0; i < maxn ; i++)
b[i]  = btnode(0);
num = 1;
datanum = 0;
flag = 1;
for(; ;)
{
if(!(cin >> s))
return 0;

if(s == "()") break;
else
{
datanum++;
int anum;
string astr = s.substr(s.find('(')+1,s.find(',') - s.find('(')-1);
string bstr = s.substr(s.find(',')+1, s.find(')')-s.find(',')-1);
stringstream ss;
ss << astr;     ss >> anum;
if(bstr == "" && b[0].v == 0)
b[0].v = anum;
else if(bstr == "" && b[0].v != 0)
flag = 0;
else if(bstr != "")
{
int k = 0;
for(int i = 0; i < bstr.size()-1; i++)
{
if(bstr[i] == 'L')
{
if(b[k].left == -1)
{add(0,0,k); k = num-1;}
else    k = b[k].left;

}
else
{
if(b[k].right == -1)
{ add(0,1,k); k = num-1;}
else    k = b[k].right;
}
}
if(bstr[bstr.size()-1] == 'L')
{
int lnum = b[k].left;
if(lnum != -1 )
{
if(b[lnum].v != 0) flag = 0;
else b[lnum].v = anum;
}
else    add(anum,0,k);
}
else
{
int rnum = b[k].right;
if(rnum != -1 )
{
if(b[rnum].v != 0) flag = 0;
else b[rnum].v = anum;
}
else    add(anum,1,k);
}

}
}

}
return 1;
}
int ans[3000];
int anum = 0;
int bfs()
{
anum = 0;
queue<int> q;
q.push(0);
if(b[0].v == 0)
return 0;
while(!q.empty())
{
int x = q.front();
q.pop();
int t = b[x].v;
ans[anum++] = t;
if(b[x].left != -1 && b[b[x].left].v != 0) q.push(b[x].left);
if(b[x].right != -1 && b[b[x].right].v != 0)    q.push(b[x].right);
}
}
int main()
{
//freopen("D://in.txt","r",stdin);
for(;;)
{
if(getdata() == 1)
{
if(flag == 0) printf("not complete\n");
else
{
bfs();
if(anum != datanum) printf("not complete\n");
else
for(int i = 0; i < anum; i++)
i == anum-1?printf("%d\n",ans[i]) : printf("%d ",ans[i]);
}
}
else break;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: