You use recursion to implement Path Compression neatly.
function find(i):
if parent[i] == i:
return i
parent[i] = find(parent[i])
return parent[i]
The part parent[i] = find(...) is what flattens the tree.
This runs in amortized time and uses space.