1. 程式人生 > >樹中兩個結點的最低公共祖先50

樹中兩個結點的最低公共祖先50

題目描述:輸入兩個樹節點,找出它們的最低公共祖先。這是一棵普通樹而且沒有指向父節點的指標。

解題思路:

  1. 使用了兩個連結串列分別儲存從根節點到輸入的兩個結點的路徑,然後把問題轉換成兩個連結串列的最後公共節點。
  2. 首先得到一條從根節點到樹中某一結點的路徑,藉助前序遍歷,VLR。
  3. 找出兩個輸入節點的兩條路徑。
  4. 找到這兩條路徑的公共結點,便是輸入兩個樹節點的最低公共祖先。

函式實現:

//第一步:得到輸入節點路徑
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); }