#include using namespace std; #define Dv(v) for (auto x : v) cerr << x << ' '; cerr << endl; #define D(x) cerr << #x << " = " << x << ", " using ll = long long; using vi = vector; using vvi = vector; const int maxN = 200010; int n; vector con[maxN]; int mysize[maxN]; void computeSize(int x, int p) { mysize[x] = 1; for (int c : con[x]) { if (c == p) continue; computeSize(c, x); mysize[x] += mysize[c]; } } int findCentroid() { int act = 1, p = 0; bool finished = false; while (!finished) { finished = true; for (int c : con[act]) { if (p == c) continue; if (n-mysize[c] <= mysize[c]) { p = act; act = c; finished = false; break; } } } return act; } bool solve(int x, int p) { vector sizes; for (int c : con[x]) { if (c == p) continue; if (!solve(c, x)) return false; sizes.push_back(mysize[c]); } sort(sizes.begin(), sizes.end()); int act = 1; for (int s : sizes) { if (act < s) return false; act += s; } return true; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; for (int i = 0; i < n-1; ++i) { int a, b; cin >> a >> b; con[a].push_back(b); con[b].push_back(a); } computeSize(1, 0); int centroid = findCentroid(); computeSize(centroid, 0); if (solve(centroid, 0)) { cout << "YES\n"; } else { cout << "NO\n"; } }