For the family tree data structure, I would recommend using a graph represented by an adjacency list. This allows easy traversal of the connections between ancestors and descendants.
For the algorithm, I would recommend Dijkstra's algorithm. Dijkstra's finds the shortest path from a starting node to all other nodes in a weighted graph. We can assign each generation a "weight" of 1, so it finds the closest living descendant. It's efficient, running in O(VlogV+E) time which should be fast enough for a family tree. Using Dijkstra's takes advantage of the graph representation and efficiently solves the problem of finding the closest living relative.