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.
求两个叶节点的第一个公共父节点。
首先深度优先遍历整棵二叉树,记录有两个目标叶节点的两条路径。
求这两个叶节点的公共父节点,相当于求两条路径的第一个公共节点。
AC代码:
class Solution
{
public:
void getList(TreeNode *root,TreeNode *p,TreeNode * q,deque<TreeNode*> &dq1,deque<TreeNode*> &dq2,deque<TreeNode*> &temp)
{
if(root==NULL)
return ;
else
{
temp.push_back(root);
if(root==p)
dq1=temp;
if(root==q)
dq2=temp;
getList(root->left,p,q,dq1,dq2,temp);
getList(root->right,p,q,dq1,dq2,temp);
temp.pop_back();
}
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
{
deque<TreeNode*> dq1;
deque<TreeNode*> dq2;
deque<TreeNode*> temp;
getList(root,p,q,dq1,dq2,temp);
int sum1=dq1.size();
int sum2=dq2.size();
int x=sum1-sum2;
deque<TreeNode*>::reverse_iterator ite1=dq1.rbegin();
deque<TreeNode*>::reverse_iterator ite2=dq2.rbegin();
if(x>0)
for(int i=0; i<x; ++i)
++ite1;
else
for(int i=0; i<(-x); ++i)
++ite2;
while(ite1!=dq2.rend())
{
if(*ite1==*ite2)
return *ite1;
else
{
++ite1;
++ite2;
}
}
}
};
其他Leetcode题目AC代码:https://github.com/PoughER/leetcode