#include <bits/stdc++.h>
using namespace std;
int n;
int d[1000005];
vector<int> e[1000005];
bool dfs_vis[1000005];
void dfs(int root, int high) {
if (dfs_vis[root] == 1) {
return;
}
dfs_vis[root] = 1;
d[root] = high;
for (int i = 0; i < e[root].size(); i++) {
dfs(e[root][i], high + 1);
}
return;
}
int dp[1000005];
vector<int> q[1000005];
bool vis[1000005];
int main() {
cin >> n;
for (int i = 1; i <= n - 1; i++) {
int u, v;
cin >> u >> v;
e[u].push_back(v); // 建树时一定要注意有双边顺序!!!不然可能访问不到!!!
e[v].push_back(u);
}
dfs(1, 1);
int num = 0;
for (int i = 1; i <= n; i++) {
// cout << d[i] << " ";
num += d[i];
}
// cout << "\n";
if (num % 2 != 0) {
cout << "-1\n";
return 0;
}
for (int i = 1; i <= n; i++) {
for (int j = num / 2; j >= d[i]; j--) {
dp[j] = dp[j];
if (dp[j - d[i]] + d[i] > dp[j]) {
dp[j] = dp[j - d[i]] + d[i];
q[j] = q[j - d[i]];
q[j].push_back(i);
}
}
}
// cout << dp[num / 2] << "\n";
if (dp[num / 2] != num / 2) {
cout << "-1\n";
return 0;
}
for (int i = 0; i < q[num / 2].size(); i++) {
vis[q[num / 2][i]] = 1;
}
for (int i = 1; i <= n; i++) {
cout << vis[i] << " ";
}
cout << "\n";
return 0;
}
TLE