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.
首先找出自根结点到两个结点的路径,并保存,然后找这两条路径最后一个相同的结点
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool getPath(TreeNode* root, TreeNode* node, list<TreeNode*>& path)
{
if (root == node)
{
path.push_back(root);
return true;
}
path.push_back(root);
TreeNode* tmp = root;
bool found_left = false;
bool found_right = false;
if (tmp->left)
found_left = getPath(tmp->left, node, path);
if (!found_left && tmp->right)
{//右子树中没有则在其左子树中寻找
found_right = getPath(tmp->right, node, path);
}
if (!found_left && !found_right)//左右子树中都未找到,则路径错误
path.pop_back();
return found_left || found_right;//返回查找结果
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root == NULL)
return NULL;
list<TreeNode*> path1, path2;
getPath(root, p, path1);
getPath(root, q, path2);
list<TreeNode*>::iterator iter1, iter2;
iter1 = path1.begin();
iter2 = path2.begin();
TreeNode* plast=NULL;
while (iter1 != path1.end() && iter2 != path2.end())
{
if (*iter1 == *iter2)
{//查找最后一个相同的结点,在此之前,都是相同的
plast = *iter1;
}
iter1++;
iter2++;
}
return plast;
}
};