§ Algorithm to find centroid of a tree

int sz[N]; // subtree sizesvector<int> es[N]; // adjacency listint go_sizes(int v, int p) {  sz[v] = 1;  for (int w : es[v]) {    if (w == p) { continue; }    go_sizes(w, v);    sz[node] += sz[i];  }}int centroid(int v, int p) {  for (int w : es[v]) {    if (w != p && sz[w] > N/2)      return centroid(w, v);  }  return v;}int main() {  ...  go_sizes(1, 1);  centroid(1, 1);};
int centroid(int v, int p) {  for (int w : es[v]) {    int wsz = 0;    if (w == p) {      // size of parent = total - our size      wsz = n - sz[v];    } else {      wsz = sz[w];    }    assert(wsz);    if (wsz > N/2) {      return centroid(w, v);    }  }  return v;}

§ Alternate definition of centroid

§ Existence of centroid

§ Equivalence to size definition

§ Centroid decomposition