This association is already two-way. Just add:
void marry(Person *p) {
married = p;
p->married = this;
}
void divorce() {
if (married == NULL) return;
married->married = NULL;
married = NULL;
}
Person mySpouseName = spouse->name;
Of course, you would need to add checks for null and other extra arithmetic like that. In C++ and other languages without garbage collection, association relationship is distinctly different from composition, which is also responsible for life time of the composed objects. So, working with associations, you can assume that some other object is holding your objects and will eventually deallocate them. For example, you could have a container object holding a list of all people.
And you mistakenly call the family relationship a "tree". Despite the common notion of the "family tree" (what a misnomer! apparently, it has some paternalistic roots, where female members were not taken seriously :-)), it is not a tree at all. In a tree, by definition, each person would have only one parent, and may have some children — a tree is a graph without cycles. Family, or native relationship between people and other animals is a more complex graph then the tree.
—SA