func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAX = 200200;   int head[MAX], nxt[MAX * 2], to[MAX * 2], dpthMx[MAX], dpthMn[MAX], Ecnt, n;   int ch[MAX], sz;   void dfs(int cur, int par) {     for (int i = head[cur]; ~i; i = nxt[i])       if (to[i] != par) {         dfs(to[i], cur);         dpthMn[cur] = min(dpthMn[cur], dpthMn[to[i]] + 1);         dpthMx[cur] = max(dpthMx[cur], dpthMx[to[i]] + 1);       }     if (dpthMn[cur] == MAX) dpthMn[cur] = 0;   }   int getNxt(int cur) {     int mx3[3]{}, mn3[3]{};     for (int i = head[cur]; ~i; i = nxt[i]) {       mn3[0] = mx3[0] = to[i];       sort(mn3, mn3 + 3, [](int a, int b) { return dpthMn[a] > dpthMn[b]; });       sort(mx3, mx3 + 3, [](int a, int b) { return dpthMx[a] < dpthMx[b]; });     }     if (dpthMx[mx3[2]] - dpthMx[mx3[1]] < 2) return 0;     dpthMx[cur] = dpthMx[mx3[1]] + 1;     dpthMn[cur] = mn3[2] != mx3[2] ? (dpthMn[mn3[2]] + 1)                   : mn3[1]         ? (dpthMn[mn3[1]] + 1)                                    : 0;     return mx3[2];   }   void addEdge(int u, int v) {     nxt[Ecnt] = head[u];     head[u] = Ecnt;     to[Ecnt++] = v;   }   int main() {     scanf( %d , &n);     memset(head, -1, (n + 1) * sizeof head[0]);     dpthMx[0] = -1;     dpthMn[0] = MAX;     fill(dpthMn, dpthMn + n + 1, MAX);     for (int i = 1, u, v; i < n; ++i) {       scanf( %d%d , &u, &v);       addEdge(u, v);       addEdge(v, u);     }     dfs(1, 0);     int cen = 1, ncen;     while (ncen = getNxt(cen)) cen = ncen;     dpthMx[0] = 0;     for (int i = head[cen]; ~i; i = nxt[i]) {       if (dpthMx[to[i]] != dpthMn[to[i]]) return puts( -1 ), 0;       ch[sz++] = dpthMx[to[i]] + 1;     }     sort(ch, ch + sz);     sz = unique(ch, ch + sz) - ch;     if (sz > 2) return puts( -1 ), 0;     ch[sz] = 0;     int ans = ch[0] + ch[1];     while (!(ans & 1)) ans >>= 1;     printf( %d n , ans);     return 0;   }   