#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define MAX(a, b) (a) = max((a), (b))
#define MIN(a, b) (a) = min((a), (b))
#define all(a) (a).begin(), (a).end()
#define sortedpair(a, b) {min((a), (b)), max((a), (b))}
const ll MOD = 1e9+7;
int n;
vector<vector<int>> v;
int dfs(int x, int m, int p = -1){
multiset<int> c;
int nagyobb = 0;
for(int i : v[x]){
if(i == p)continue;
int t = dfs(i, m, x);
if(t == -1)return -1;
if(t >= m)nagyobb++;
else c.insert(t);
}
if(c.empty()){
if(nagyobb)return m+1;
else return 1;
}
auto it = c.begin();
bool nemsikerult = false;
while(it != c.end() && c.size() >= 2){
auto it2 = c.lower_bound(m-*it);
if(it == it2)it2++;
if(it2 == c.end()){
if(nagyobb){
it = c.erase(it);
nagyobb--;
} else {
if(nemsikerult)
return -1;
nemsikerult = true;
it++;
continue;
}
}
it = c.erase(it);
if(it == it2){
it = c.erase(it);
} else {
c.erase(it2);
}
}
if(c.size() == 0){
if(nagyobb)return m+1;
return 1;
}
if(nagyobb >= 2)return m+1;
return *c.begin()+1;
// multiset<int> c; // konstans ??
// for(int i : v[x]){
// if(i == p)continue;
// int t = dfs(i, m, x);
// if(t == -1)return -1;
// c.insert(t);
// }
// if(c.empty()) return 1;
// auto it = c.begin();
// while(it != c.end() && *it < (m+1)/2){
// auto it2 = c.lower_bound(m-*it);
// if(it2 == c.end()){
// it++;
// continue;
// }
// it = c.erase(it);
// if(it == it2){
// c.erase(it);
// break;
// }
// c.erase(it2);
// }
// if(c.empty()){
// return 1;
// }
// if(*c.begin() >= (m+1)/2){
// if(c.size() % 2 == 1) return 1 + *c.rbegin();
// else return 1;
// }
// if(c.size() == 1){
// return *c.begin()+1;
// }
// if(*next(c.begin()) < (m+1)/2){
// return -1;
// }
// if(c.size()%2 == 0){
// return -1;
// }
// return 1 + *c.begin();
// while(*c.begin() < m && c.size() >= 2){
// c.erase(c.begin()); c.erase(c.begin());
// }
// if(c.empty()) return 1;
// return *c.rbegin() + 1;
}
void solve(){
cin>>n;
v.assign(n, {});
for(int i = 0; i < n-1; i++){
int a, b; cin>>a>>b; a--; b--;
v[a].push_back(b);
v[b].push_back(a);
}
int start = 0;
for(int i = 0; i < n; i++){
if(v[i].size() == 1) {
start = i;
break;
}
}
if(v[v[start][0]].size() == n-1){
cout<<(n%2 == 1 ? 2 : 1)<<endl;
return;
}
int l = 1, r = n-1;
while(l < r){
int m = (l+r+1)/2;
int res = dfs(start, m);
if(res > m || res == 1){
l = m;
} else {
r = m-1;
}
}
cout<<l<<endl;
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
int _t = 1;
// cin >> _t;
while (_t--) {
solve();
}
return 0;
}