Solution: This is not a difficult problem. If there is parent pointer, things will be easier. However, simple solution still exist for tree nodes without parent pointer. See the code below:
node * common_ancestor(node *root, node *n1, node *n2) { if(root==null || n1 == null || n2 == null) return null; if(n1 == root || n2 == root) return root; node * left = common_ancestor(root->left, n1, n2); node * right = common_ancestor(root->right, n1, n2); if(left && right) return root; return left ? left : right; }
More: if we need to do many common_ancestor() operations, there is a more efficient off-line algorithm called "Tarjan's off-line least common ancestors algorithm". It can get the least common ancestors for m pairs of nodes in just one tree traversal. The main idea is to leverage disjointed forest with path compression and union by rank.
No comments:
Post a Comment