#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1.1e5;
int N;
vector<int> adj[MAXN];
vector<int> order;
void dfs(int cur, int prv) {
if (prv != -1) {
adj[cur].erase(find(adj[cur].begin(), adj[cur].end(), prv));
}
for (int nxt : adj[cur]) {
dfs(nxt, cur);
}
order.push_back(cur);
}
int bestUp[MAXN];
bool isGood(int v) {
auto pairUp = [&](const vector<int>& vals) -> bool {
int i = 0, j = int(lower_bound(vals.begin(), vals.end(), v) - vals.begin());
int extraCnt = int(vals.size()) - j;
j--;
for (; i <= j; i++) {
if (i < j && vals[i]+vals[j] >= v) {
j--;
} else {
if (extraCnt == 0) return false;
extraCnt--;
}
}
return true;
};
for (int cur : order) {
vector<int> ch; ch.reserve(adj[cur].size());
for (int nxt : adj[cur]) {
ch.push_back(bestUp[nxt]+1);
}
sort(ch.begin(), ch.end());
if (cur == 0) {
return pairUp(ch);
}
int mi = -1, ma = int(ch.size());
while (ma - mi > 1) {
int md = (mi + ma) / 2;
vector<int> nch = ch;
nch.erase(nch.begin()+md);
if (pairUp(nch)) {
mi = md;
} else {
ma = md;
}
}
if (mi >= 0) {
bestUp[cur] = ch[mi];
} else if (pairUp(ch)) {
bestUp[cur] = 0;
} else {
return false;
}
}
assert(false);
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> N;
for (int e = 0; e < N-1; e++) {
int a, b; cin >> a >> b; a--, b--;
adj[a].push_back(b);
adj[b].push_back(a);
}
order.reserve(N);
dfs(0, -1);
int mi = 1, ma = N;
while (ma - mi > 1) {
int md = (mi + ma) / 2;
if (isGood(md)) {
mi = md;
} else {
ma = md;
}
}
cout << mi << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTUFYTiA9IDEuMWU1OwppbnQgTjsKdmVjdG9yPGludD4gYWRqW01BWE5dOwp2ZWN0b3I8aW50PiBvcmRlcjsKCnZvaWQgZGZzKGludCBjdXIsIGludCBwcnYpIHsKCWlmIChwcnYgIT0gLTEpIHsKCQlhZGpbY3VyXS5lcmFzZShmaW5kKGFkaltjdXJdLmJlZ2luKCksIGFkaltjdXJdLmVuZCgpLCBwcnYpKTsKCX0KCWZvciAoaW50IG54dCA6IGFkaltjdXJdKSB7CgkJZGZzKG54dCwgY3VyKTsKCX0KCW9yZGVyLnB1c2hfYmFjayhjdXIpOwp9CgppbnQgYmVzdFVwW01BWE5dOwoKYm9vbCBpc0dvb2QoaW50IHYpIHsKCWF1dG8gcGFpclVwID0gWyZdKGNvbnN0IHZlY3RvcjxpbnQ+JiB2YWxzKSAtPiBib29sIHsKCQlpbnQgaSA9IDAsIGogPSBpbnQobG93ZXJfYm91bmQodmFscy5iZWdpbigpLCB2YWxzLmVuZCgpLCB2KSAtIHZhbHMuYmVnaW4oKSk7CgkJaW50IGV4dHJhQ250ID0gaW50KHZhbHMuc2l6ZSgpKSAtIGo7CgkJai0tOwoJCWZvciAoOyBpIDw9IGo7IGkrKykgewoJCQlpZiAoaSA8IGogJiYgdmFsc1tpXSt2YWxzW2pdID49IHYpIHsKCQkJCWotLTsKCQkJfSBlbHNlIHsKCQkJCWlmIChleHRyYUNudCA9PSAwKSByZXR1cm4gZmFsc2U7CgkJCQlleHRyYUNudC0tOwoJCQl9CgkJfQoJCXJldHVybiB0cnVlOwoJfTsKCWZvciAoaW50IGN1ciA6IG9yZGVyKSB7CgkJdmVjdG9yPGludD4gY2g7IGNoLnJlc2VydmUoYWRqW2N1cl0uc2l6ZSgpKTsKCQlmb3IgKGludCBueHQgOiBhZGpbY3VyXSkgewoJCQljaC5wdXNoX2JhY2soYmVzdFVwW254dF0rMSk7CgkJfQoJCXNvcnQoY2guYmVnaW4oKSwgY2guZW5kKCkpOwoKCQlpZiAoY3VyID09IDApIHsKCQkJcmV0dXJuIHBhaXJVcChjaCk7CgkJfQoKCQlpbnQgbWkgPSAtMSwgbWEgPSBpbnQoY2guc2l6ZSgpKTsKCQl3aGlsZSAobWEgLSBtaSA+IDEpIHsKCQkJaW50IG1kID0gKG1pICsgbWEpIC8gMjsKCQkJdmVjdG9yPGludD4gbmNoID0gY2g7CgkJCW5jaC5lcmFzZShuY2guYmVnaW4oKSttZCk7CgkJCWlmIChwYWlyVXAobmNoKSkgewoJCQkJbWkgPSBtZDsKCQkJfSBlbHNlIHsKCQkJCW1hID0gbWQ7CgkJCX0KCQl9CgkJaWYgKG1pID49IDApIHsKCQkJYmVzdFVwW2N1cl0gPSBjaFttaV07CgkJfSBlbHNlIGlmIChwYWlyVXAoY2gpKSB7CgkJCWJlc3RVcFtjdXJdID0gMDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoJYXNzZXJ0KGZhbHNlKTsKfQoKaW50IG1haW4oKSB7Cglpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOwoKCWNpbiA+PiBOOwoJZm9yIChpbnQgZSA9IDA7IGUgPCBOLTE7IGUrKykgewoJCWludCBhLCBiOyBjaW4gPj4gYSA+PiBiOyBhLS0sIGItLTsKCQlhZGpbYV0ucHVzaF9iYWNrKGIpOwoJCWFkaltiXS5wdXNoX2JhY2soYSk7Cgl9CgoJb3JkZXIucmVzZXJ2ZShOKTsKCWRmcygwLCAtMSk7CgoJaW50IG1pID0gMSwgbWEgPSBOOwoJd2hpbGUgKG1hIC0gbWkgPiAxKSB7CgkJaW50IG1kID0gKG1pICsgbWEpIC8gMjsKCQlpZiAoaXNHb29kKG1kKSkgewoJCQltaSA9IG1kOwoJCX0gZWxzZSB7CgkJCW1hID0gbWQ7CgkJfQoJfQoJY291dCA8PCBtaSA8PCAnXG4nOwoKCXJldHVybiAwOwp9Cg==