#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
struct node
{
vector<int> linkto;
int build[3];//0 为自己建塔, 1 为父节点建塔, 2为子节点建塔
};
node pasture[10005];
int calcPos(int pos, int f);
int main()
{
int i, j, n, a, b, res;
scanf("%d", &n);
for(i = 0; i < n - 1; i ++)
{
scanf("%d %d", &a, &b);
pasture[a - 1].linkto.push_back(b - 1);
pasture[b - 1].linkto.push_back(a - 1);
}
calcPos(0, 0);
res = min(pasture[0].build[0], pasture[0].build[2]);
printf("%d\n", res);
return 0;
}
int calcPos(int pos, int f)
{
int i, tmp;
bool flag = false;
pasture[pos].build[0] = 1;
pasture[pos].build[1] = 0;
pasture[pos].build[2] = 0;
for(i = 0; i < pasture[pos].linkto.size(); i ++)
{
if(pasture[pos].linkto[i] != f)
{
calcPos(pasture[pos].linkto[i], pos);
pasture[pos].build[0] += min(min(pasture[ pasture[pos].linkto[i] ].build[0], pasture[ pasture[pos].linkto[i] ].build[1])
, pasture[ pasture[pos].linkto[i] ].build[2]);
pasture[pos].build[1] += min(pasture[ pasture[pos].linkto[i] ].build[0], pasture[ pasture[pos].linkto[i] ].build[2]);
pasture[pos].build[2] += min(pasture[ pasture[pos].linkto[i] ].build[0], pasture[ pasture[pos].linkto[i] ].build[2]);
flag = flag || (pasture[ pasture[pos].linkto[i] ].build[0] <= pasture[ pasture[pos].linkto[i] ].build[2]);
}
}
if(pasture[pos].build[2] == 0)
{
pasture[pos].build[2] = 100000;
return 0;
}
if(flag == false)
{
tmp = 100000;
for(i = 0; i < pasture[pos].linkto.size(); i ++)
{
if(pasture[pos].linkto[i] != f
&& pasture[pasture[pos].linkto[i]].build[0] - pasture[pasture[pos].linkto[i]].build[2] < tmp)
tmp = pasture[pasture[pos].linkto[i]].build[0] - pasture[pasture[pos].linkto[i]].build[2];
}
pasture[pos].build[2] += tmp;
}
return 0;
}