#include #define rep(i,n) for(int i=0;i<(int)(n);i++) #define chmin(x,y) x = min((x),(y)); #define chmax(x,y) x = max((x),(y)); using namespace std; using ll = long long ; using P = pair ; using pll = pair; const int INF = 1e9; const long long LINF = 1e17; const int MOD = 1000000007; //const int MOD = 998244353; const double PI = 3.14159265358979323846; int main(){ int n; cin >> n; vector> G(n); rep(i,n-1){ int a,b; cin >> a >> b; --a;--b; G[a].push_back(b); G[b].push_back(a); } bool ok = true; int one = 0; rep(i,n){ if((int)G[i].size() == 1){ ++one; } else if((int)G[i].size() != 2){ ok = false; } } if(one == 2 && ok){ cout << "Yes" << endl; return 0; } vector dis(n,0); auto dfs = [&](auto&& dfs,int i,int p,int c) -> void{ dis[i] = c; for(int j:G[i]){ if(j == p) continue; dfs(dfs,j,i,c + 1); } return; }; dfs(dfs,0,-1,0); int ma = 0,ind = -1; rep(i,n){ if(ma < dis[i]){ ma = dis[i]; ind = i; } } dfs(dfs,ind,-1,0); ma = 0; rep(i,n) chmax(ma,dis[i]); if(ma % 2 == 1){ cout << "No" << endl; return 0; } rep(i,n){ if((int)G[i].size() == 1){ if(dis[i] != ma && dis[i] != 0){ cout << "No" << endl; return 0; } } } ind = -1; rep(i,n){ if(dis[i] == (ma / 2)){ ind = i; break; } } dfs(dfs,ind,-1,0); rep(i,n){ if((int)G[i].size() == 1){ if(dis[i] != ma / 2){ cout << "No" << endl; return 0; } } } ok = true; one = 0; rep(i,n){ if((int)G[i].size() != 2 && (int)G[i].size() != 1 && i != ind){ cout << "No" << endl; return 0; } } cout << "Yes" << endl; return 0; }