求树中两个结点的最低公共祖先(普通树)## 标题
//定义树节点
struct TreeNode8
{
char m_nValue;
TreeNode8* m_pLeft;
TreeNode8* m_pRight;
};
//获得结点对应的路径
bool GetNodePath(TreeNode8* pRoot, TreeNode8* pNode, list<TreeNode8*>&path)
{
if (pRoot == pNode)
return true;
path.push_back(pRoot);
bool found = false;
if (pRoot != NULL)
{
found = GetNodePath(pRoot->m_pLeft, pNode, path);
}
if (!found&&pRoot!=NULL)
found = GetNodePath(pRoot->m_pRight, pNode, path);
if (!found)
path.pop_back();
return found;
}
//根据路径获得第一个公共结点
TreeNode8* GetLastCommonNode(const list<TreeNode8*>& path1, const list<TreeNode8*>& path2)
{
list<TreeNode8*>::const_iterator iterator1 = path1.begin();
list<TreeNode8*>::const_iterator iterator2 = path2.begin();
TreeNode8* pLast = NULL;
while (iterator1 != path1.end() && iterator2 != path2.end())
{
if (*iterator1 == *iterator2)
pLast = *iterator1;
iterator1++;
iterator2++;
}
return pLast;
}
TreeNode8* GetLastCommonParent(TreeNode8* pRoot, TreeNode8* pNode1, TreeNode8* pNode2)
{
if (pRoot == NULL || pNode1 == NULL || pNode2 == NULL)
{
return NULL;
}
list<TreeNode8*>path1;
GetNodePath(pRoot, pNode1, path1);
list<TreeNode8*> path2;
GetNodePath(pRoot, pNode2, path2);
return GetLastCommonNode(path1, path2);
}
//生成树
void SetSubTreeNode8(TreeNode8* root, TreeNode8* lChild, TreeNode8* rChild)
{
if (root == NULL)
{
return;
}
root->m_pLeft = lChild;
root->m_pRight = rChild;
}
void setbinarytree8()
{
TreeNode8* nodeA1 = new TreeNode8();
nodeA1->m_nValue = 'A';
TreeNode8* nodeA2 = new TreeNode8();
nodeA2->m_nValue = 'B';
TreeNode8* nodeA3 = new TreeNode8();
nodeA3->m_nValue = 'C';
TreeNode8* nodeA4 = new TreeNode8();
nodeA4->m_nValue = 'D';
TreeNode8* nodeA5 = new TreeNode8();
nodeA5->m_nValue = 'E';
TreeNode8* nodeA6 = new TreeNode8();
nodeA6->m_nValue = 'F';
TreeNode8* nodeA7 = new TreeNode8();
nodeA7->m_nValue = 'G';
TreeNode8* nodeA8 = new TreeNode8();
nodeA8->m_nValue = 'H';
TreeNode8* nodeA9 = new TreeNode8();
nodeA9->m_nValue = 'I';
TreeNode8* nodeA10 = new TreeNode8();
nodeA10->m_nValue = 'J';
SetSubTreeNode8(nodeA1, nodeA2, nodeA3);
SetSubTreeNode8(nodeA2, nodeA4, nodeA5);
SetSubTreeNode8(nodeA4, nodeA6, nodeA7);
SetSubTreeNode8(nodeA5, nodeA8, nodeA9);
SetSubTreeNode8(nodeA8, nodeA10, nodeA9);
cout << "第一个公共祖先为:" << GetLastCommonParent(nodeA1, nodeA3, nodeA8)->m_nValue << endl;
}
int main()
{
setbinarytree8();
Sleep(1000000000);
}