樹中兩個結點的最低公共祖先50
阿新 • • 發佈:2019-01-03
題目描述:輸入兩個樹節點,找出它們的最低公共祖先。這是一棵普通樹而且沒有指向父節點的指標。
解題思路:
- 使用了兩個連結串列分別儲存從根節點到輸入的兩個結點的路徑,然後把問題轉換成兩個連結串列的最後公共節點。
- 首先得到一條從根節點到樹中某一結點的路徑,藉助前序遍歷,VLR。
- 找出兩個輸入節點的兩條路徑。
- 找到這兩條路徑的公共結點,便是輸入兩個樹節點的最低公共祖先。
函式實現:
//第一步:得到輸入節點路徑
bool GetNodePath(TreeNode *pRoot, TreeNode *pNode, list<TreeNode*> &path){
if (pRoot == pNode)
return true;
//前序遍歷
path.push_back(pRoot);
bool found = false;
std::vector<TreeNode*>::iterator i = pRoot->m_vChildren.begin();
while(!found && i < pRoot->m_vChildren.end()){
found = GetNodePath(*i, pNode, path);
++i;
}
if (!found)
path.pop_back();
return found;
}
//第二步:得到公共節點
TreeNode* GetLastCommonNode(const list<TreeNode*> &path1, const list<TreeNode*> &path2){
list<TreeNode*>::iterator iterator1 = path1.begin();
list<TreeNode*>::iterator iterator2 = path2.begin();
TreeNode *pLast = NULL;
while (iterator1 != path1.end() && iterator2 != path2.end()){
if(*iterator1 == *iterator2)
pLast = *iterator1;
++iterator1;
++iterator2;
}
return pLast;
}
//第三步:主函式
TreeNode* GetLastCommonParent(TreeNode *pRoot, TreeNode *pNode1, TreeNode *pNode2){
if(pRoot == NULL || pNode1 == NULL || pNode2 == NULL)
return NULL;
//節點1的路徑
list<TreeNode*> path1;
GetLastCommonNode(pRoot, pNode1, path1);
//節點2的路徑
list<TreeNode*> path2;
GetLastCommonNode(pRoot, pNode2, path2);
return GetLastCommonParent(path1, path2);
}