#include <bits/stdc++.h>
using namespace std;
int n, head[100005], tot, d[100005], fa[100005], vis[100005], lf[100005], cnt;
struct node {
  int v, nxt;
} edg[100005 << 1];
inline void addedg(int u, int v) {
  edg[tot].v = v;
  edg[tot].nxt = head[u];
  head[u] = tot++;
}
inline void init() {
  memset(head, -1, sizeof(int) * (n + 1));
  tot = cnt = 0;
}
inline void dfs1(int u, int f) {
  int v;
  d[u] = 0;
  for (int i = head[u]; i != -1; i = edg[i].nxt) {
    v = edg[i].v;
    ++d[u];
    if (v == f) continue;
    dfs1(v, u);
  }
}
inline void dfs2(int u, int f, int dis) {
  int v;
  fa[u] = f;
  d[u] = dis;
  for (int i = head[u]; i != -1; i = edg[i].nxt) {
    v = edg[i].v;
    if (f == v) continue;
    dfs2(v, u, dis + 1);
  }
}
inline bool cmp(int u, int v) { return d[u] > d[v]; }
set<int> se;
int main() {
  scanf("%d", &n);
  init();
  int u, v;
  for (int i = 1; i < n; ++i) {
    scanf("%d%d", &u, &v);
    addedg(u, v);
    addedg(v, u);
  }
  dfs1(1, 1);
  for (int i = 1; i <= n; ++i) {
    if (d[i] == 1) lf[cnt++] = i;
  }
  int root = lf[0];
  dfs2(root, root, 0);
  vis[root] = 1;
  int maxn = 0, minn = 1;
  for (int i = 1; i < cnt; ++i) {
    if (d[lf[i]] & 1) minn = 3;
  }
  fa[root] = edg[head[root]].v;
  maxn = n - 1 - cnt;
  for (int i = 0; i < cnt; ++i) se.insert(fa[lf[i]]);
  maxn += se.size();
  printf("%d %d\n", minn, maxn);
  return 0;
}
