func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 100005;   struct Edge {     int to, next;   } e[N << 1];   int in[N], head[N], sz;   int del[N], leg[N];   int cnt[N];   int res, n;   void addedge(int u, int v) {     e[sz].to = v;     e[sz].next = head[u];     head[u] = sz++;   }   void init() {     memset(head, -1, sizeof(head));     memset(in, 0, sizeof(in));     memset(del, 0, sizeof(del));     memset(cnt, 0, sizeof(cnt));     sz = 0;     res = 1;   }   void dfs1(int u, int f = 0) {     int f1 = 0, f2 = 0;     for (int i = head[u]; i != -1; i = e[i].next) {       int v = e[i].to;       if (v == f) continue;       f1 = 1;       dfs1(v, u);       if (del[v]) f2 = 1;     }     if (!f1 || (f2 && in[u] < 3)) del[u] = 1;   }   void calc(int u) {     leg[u] = 0;     for (int i = head[u]; i != -1; i = e[i].next) {       int v = e[i].to;       if (del[v]) leg[u]++;     }     leg[u] = min(leg[u], 2);   }   bool check(int u) {     int cnt = 0;     for (int i = head[u]; i != -1; i = e[i].next) {       int v = e[i].to;       if (!del[v] && in[v] - leg[v] > 1) ++cnt;     }     return cnt > 2;   }   void solve() {     init();     int x, y;     for (int i = 1; i < n; i++) {       scanf( %d%d , &x, &y);       addedge(x, y);       addedge(y, x);       in[x]++;       in[y]++;     }     int s = 0;     for (int i = 1; i <= n; i++)       if (in[s] < in[i]) s = i;     if (in[s] <= 2) {       printf( Yes n );       return;     }     dfs1(s);     for (int i = 1; i <= n; i++) calc(i);     int flag = 0;     for (int i = 1; i <= n; i++) flag |= check(i);     printf(!flag ?  Yes n  :  No n );   }   int main() {     while (~scanf( %d , &n)) solve();     return 0;   }   