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.
思路是找到两个点的路径,然后找最后一个相同的点:
c++实现:
/**
* 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:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
vector< vector<TreeNode*> > path=bfs(root,p,q);
TreeNode* LCA;
for (int i=0;i<min( path[1].size(), path[0].size() );i++){
if (path[0][i]==path[1][i])
LCA=path[0][i];
else
break;
}
return LCA;
}
vector< vector<TreeNode*> > bfs(TreeNode* root, TreeNode* p, TreeNode* q){
queue<vector<TreeNode*>> que;
vector<TreeNode*> path;
vector< vector<TreeNode*> > res;
path.push_back(root);
if (root==p || root==q)
res.push_back(path);
que.push(path);
while(!que.empty()){
vector<TreeNode*> temp=que.front();
que.pop();
int len=temp.size();
TreeNode* node=temp[len-1];
if (node->left!=NULL){
temp.push_back(node->left);
que.push(temp);
if (node->left==p || node->left==q)
res.push_back(temp);
if (res.size()==2)
return res;
temp.erase(temp.begin()+len);
}
if (node->right!=NULL){
temp.push_back(node->right);
que.push(temp);
if (node->right==p || node->right==q)
res.push_back(temp);
if (res.size()==2)
return res;
temp.erase(temp.begin()+len);
}
}
return res;
}
};
递归法:
参考LeetCode Discuss
链接地址:https://leetcode.com/discuss/45386/4-lines-c-java-python-ruby
如果当前节点为空或者与目标节点之一相同,则返回当前节点
递归寻找p和q在左右子树中的位置
如果p和q分别位于root的左右两侧,则root为它们的LCA,否则为左子树或者右子树
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (!root || root == p || root == q) return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
return !left ? right : !right ? left : root;
}