TreeNode *Find(TreeNode *pRoot,TreeNode *pNode)
{
if(pRoot == NULL){
return NULL;
}
if(pRoot == pNode){
return pRoot;
}
TreeNode *pFound = Find(pRoot->pLeft,pNode);
if(pFound != NULL){
return pFound;
}
return Find(pRoot->pRight,pNode);
}
TreeNode *FindLowestAncestor(TreeNode *pRoot,TreeNode *n1,TreeNode *n2)
{
//在左子树中找 n1
TreeNode* pN1LeftFound = Find(pRoot->pLeft,n1);
//在左子树中找 n2
TreeNode* pN2LeftFound = Find(pRoot->pLeft,n2);
//在右子树中找 n1
TreeNode* pN1RightFound = Find(pRoot->pRight,n1);
//在右子树中找 n2
TreeNode* pN2RightFound = Find(pRoot->pRight,n2);
/* 四种情况:
1.n1 和 n2 都在一棵子树中
2.n1 和 n2 不在一棵子树中
3.n1 或 n2 一个是根(pRoot),另一个在一棵子树中
4.n1 或 n2 有一个没找到
*/
if(pN1LeftFound!=NULL&&pN2LeftFound!=NULL){
//n1 和 n2 都在左子树中
return FindLowestAncestor(pRoot->pLeft,n1,n2);
}
if(pN1RightFound!=NULL&&pN2RightFound!=NULL){
//n1 和 n2 都在右子树中
return FindLowestAncestor(pRoot->pRight,n1,n2);
}
if(pN1LeftFound!=NULL&&pN2RightFound!=NULL){
//n1 在左子树中,n2 在右子树中
return pRoot;
}
if(pN1RightFound!=NULL&&pN2LeftFound!=NULL){
//n1 在右子树中,n2 在左子树中
return pRoot;
}
if(n1==pRoot&&(pN2LeftFound||pN2RightFound)){
//n1 是根结点,n2 在一棵子树中
return pRoot;
}
if(n2==pRoot&&(pN1LeftFound||pN1RightFound)){
//n2 是根结点,n1 在一棵字数中
return pRoot;
}
return NULL;
}