#include using namespace std; #define fwd(i, a, n) for (int i = (a); i < (n); i ++) #define rep(i, n) fwd(i, 0, n) #define all(X) begin(X), end(X) #define sz(X) ((int)X.size()) #define st first #define nd second #define pii pair #define vi vector #define ll long long #ifdef LOC auto &operator<<(auto &out, pair a) { return out << "(" << a.st << ", " << a.nd << ")"; } auto &operator<<(auto &out, auto a) { out << "{"; for (auto b : a) out << b << ", "; return out << "}"; } void dump(auto... x) { ((cerr << x << ", "), ...) << '\n'; } #define debug(x...) cerr << "[" #x "]: ", dump(x) #else #define debug(...) 0 #endif const int maxN = 200 * 1000 + 10; vi g[maxN]; int sub[maxN]; int n; vi cents; void prep(int v, int p = -1) { sub[v] = 1; vi suby; for (auto u : g[v]) if (u != p) { prep(u, v); sub[v] += sub[u]; suby.push_back(sub[u]); } if (p != -1) suby.push_back(n - sub[v]); if (sz(suby)) { int worst = *max_element(all(suby)); if (worst <= n / 2) { cents.push_back(v); } } else { cents.push_back(v); } } int verify(int v, int p = -1) { vi suby; for (auto u : g[v]) { if (u != p) { int lol = verify(u, v); if (lol == -1) return -1; suby.push_back(lol); } } sort(all(suby)); int akt = 1; for (auto x : suby) if (x > akt) { return -1; } else { akt += x; } return akt; } int32_t main() { ios_base::sync_with_stdio(0), cin.tie(0); cin >> n; rep(i, n - 1) { int v, u; cin >> v >> u; v --, u --; g[v].push_back(u); g[u].push_back(v); } prep(0); for (auto c : cents) { if (verify(c) == n) { cout << "YES\n"; return 0; } } cout << "NO\n"; return 0; }