上图中节点C、D的最低公共祖先为B;
节点B、E 的最低公共祖先为A;
节点D、F的最低公共最先为A;
其与的依次类推即可。
代码如下:
BTNode* GetAncestorOfTwoNode(BTNode* pRoot, int nData1, int nData2)
{
if (NULL == pRoot)
return NULL;
std::deque<BTNode*> myDeque1;
std::deque<BTNode*> myDeque2;
// 获取从根节点到目标节点的路径
GetThePathOfNode(pRoot, nData1, myDeque1);
GetThePathOfNode(pRoot, nData2, myDeque2);
// 输入的节点可能不在链表中
if (myDeque1.empty() || myDeque2.empty())
return NULL;
// 定义pPreEqualNode指向最低的公共祖先
BTNode* pPreEqualNode = NULL;
while (!myDeque1.empty() && !myDeque2.empty())
{
if (myDeque1.front() != myDeque2.front())
break;
pPreEqualNode = myDeque1.front();
myDeque1.pop_front();
myDeque2.pop_front();
}
return pPreEqualNode;
}
void GetAncestorOfTwoNodes(BTNode* pRoot, int nData1, int nData2)
{
if (NULL == pRoot)
{
std::cout << "Root is Empty!" << std::endl;
}
BTNode* pNode = GetAncestorOfTwoNode(pRoot, nData1, nData2);
if (NULL == pNode)
std::cout << "Not Find!" << std::endl;
else
std::cout << "The Ancestor Is: " << pNode->nData << std::endl;
}
参考文献: 剑指Offer、面试题50 、树中两个节点的最低公共祖先