Problem:
Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.
According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”
_______3______ / \ ___5__ ___1__ / \ / \ 6 _2 0 8 / \ 7 4
For example, the lowest common ancestor (LCA) of nodes 5
and 1
is 3
. Another example is LCA of nodes 5
and 4
is 5
, since a node can be a descendant of itself according to the LCA definition.
Analysis:
Solutions:
C++:
void GetPath(TreeNode *node, TreeNode *p_cur, stack<TreeNode *>& path_stack)
{
TreeNode *visited_node = NULL;
while(p_cur || !path_stack.empty()) {
if(p_cur) {
path_stack.push(p_cur);
p_cur = p_cur->left;
} else {
p_cur = path_stack.top();
if(p_cur->right == NULL || p_cur->right == visited_node) {
if(p_cur == node)
return;
path_stack.pop();
visited_node = p_cur;
p_cur = NULL;
} else
p_cur = p_cur->right;
}
}
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(p == NULL || q == NULL)
return NULL;
if(p == q)
return p;
stack<TreeNode *> path_stack_p;
GetPath(p, root, path_stack_p);
stack<TreeNode *> path_stack_q;
GetPath(q, root, path_stack_q);
vector<TreeNode *> path_list_p;
while(!path_stack_p.empty()) {
path_list_p.push_back(path_stack_p.top());
path_stack_p.pop();
}
while(!path_stack_q.empty()) {
TreeNode *p_cur = path_stack_q.top();
path_stack_q.pop();
for(int i = 0; i < path_list_p.size(); ++i) {
if(path_list_p[i] == p_cur)
return p_cur;
}
}
return root;
}
Java
:
Python: