#include //#pragma GCC optimize("O3") //#define int long long using namespace std; #define rep(i, a, b) for(int i = a; i < (b); ++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() typedef long long ll; typedef pair pii; typedef vector vi; void dfs(int u, int p, vector> &g, vector &s, vector &roots, int n){ s[u] = 1; for(int v : g[u]) if(v != p){ dfs(v, u, g, s, roots, n); s[u] += s[v]; } int canroot = 1; for(int v : g[u]) if(v != p){ if(s[v] > n-s[v]) canroot = 0; } if(n-s[u] > s[u]) canroot = 0; if(canroot) roots.push_back(u); } int solve(int u, int p, vector> &g, int &poss){ vector kids; for(int v : g[u]) if(v != p){ kids.push_back(solve(v, u, g, poss)); if(!poss) return 0; } sort(begin(kids), end(kids)); int sz = 1; for(int i = 0; i < sz(kids); i++){ if(kids[i] > sz){ poss = 0; return 0; } sz += kids[i]; } return sz; } signed main(){ cin.tie(0); ios::sync_with_stdio(0); int n; cin >> n; vector> g(n); for(int i = 1, u, v; i < n; i++){ cin >> u >> v; u--, v--; g[u].push_back(v); g[v].push_back(u); } vector s(n), roots; dfs(0, 0, g, s, roots, n); for(int r : roots){ int poss = 1; solve(r, r, g, poss); if(poss){ cout << "YES\n"; return 0; } } cout << "NO\n"; }