#include <bits/stdc++.h>
using namespace std;
# define Rep(i,a,b) for(int i=a;i<=b;i++)
# define _Rep(i,a,b) for(int i=a;i>=b;i--)
# define RepG(i,u) for(int i=head[u];~i;i=e[i].next)
# define maxn 1000005
# define int unsigned long long
typedef long long ll;
template<typename T> void read(T &x){
x=0;int f=1;
char c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+c-'0';
x*=f;
}
struct node{
int id, v;
}_dep[maxn];
bool operator < (node a, node b)
{
return a.v < b.v;
}
int n;
int dep[maxn];
queue <int> q;
bool ans[maxn];
vector <int> e[maxn];
int sum, now, f;
void dfs(int u, int fa)
{
dep[u] = dep[fa] + 1;
for(int i = 0; i < e[u].size(); i++){
if(e[u][i] == fa) continue;
dfs(e[u][i], u);
}
}
signed main()
{
read(n);
for(int i = 1; i <= n - 1; i++){
int u, v;
read(u), read(v);
e[u].push_back(v), e[v].push_back(u);
}
dfs(1, 0);
for(int i = 1; i <= n; i++)
_dep[i].id = i, _dep[i].v = dep[i];
sort(_dep + 1, _dep + n + 1);
for(int i = 1; i <= n; i++) sum += dep[i];
if(sum % 2){
cout << -1 << endl;
return 0;
}
for(int i = 1; i <= n; i++){
q.push(i); now += _dep[i].v;
while(now > sum / 2) now -= _dep[q.front()].v, q.pop();
if(now == sum / 2){
while(!q.empty()) ans[_dep[q.front()].id] = 1, q.pop();
f = 1;
break;
}
}
if(f){
for(int i = 1; i <= n; i++) cout << ans[i] << " ";
return 0;
}
cout << -1 << endl;
return 0;
}
WA on #27。