Here is the solution:
dp = 2D array of size n x 2
function dfs(u, p):
dp[u][0] = 0
dp[u][1] = 0
sum = 0
for v in adj[u]:
if v == p:
continue
dfs(v, u)
sum = sum + max(dp[v][0], dp[v][1])
dp[u][0] = sum
for v in adj[u]:
if v == p:
continue
dp[u][1] = max(dp[u][1], 1 + dp[v][0] + (sum - max(dp[v][0], dp[v][1])))
dfs(1, 0)
print max(dp[1][0], dp[1][1])
This runs in time and uses space.