#include using namespace std; vector p; vector> adj; /* void dfs(int node, int par) { p[node] = par; for(auto& c : adj[node]) { if(c == par) continue; dfs(c, node); } } */ int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; adj = vector>(n); for(int i = 0; i < n - 1; i++) { int a,b; cin >> a >> b; a--,b--; adj[a].push_back(b); adj[b].push_back(a); } if(n <= 3) { cout << "YES" << endl; return 0; } set> lvs; vector cnt (n, 1); vector sz (n); for(int i = 0; i < n; i++) { sz[i] = adj[i].size(); if(sz[i] == 1) { lvs.insert({cnt[i], i}); } } vector vis(n, 0); bool bad = 0; while((int)lvs.size() > 1) { auto [c, node] = *lvs.begin(); int z; for(auto y : adj[node]){ if(!vis[y]){ z = y; if(cnt[y] < c) { bad = 1; break; } } } if(bad)break; vis[node] = 1; lvs.erase(lvs.begin()); cnt[z] += c; sz[z]--; if(sz[z] == 1) { // Only parent lvs.insert({cnt[z], z}); } } if(!bad) { cout << "YES" << endl; } else { cout << "NO" << endl; } }