//二叉树中两个结点的最低公共祖先
#include<iostream>
#include<stack>
using namespace std;
struct binaryTreeNode
{
int value;
binaryTreeNode *pLeft;
binaryTreeNode *pRight;
};
bool getNodePath(binaryTreeNode *pRoot,binaryTreeNode *pTarget,stack<binaryTreeNode *> &path)
{
if(pRoot==NULL || pTarget==NULL || !path.empty())
{
return false;
}
//后序遍历
binaryTreeNode *pNode=pRoot;
binaryTreeNode *pLastVisited=NULL;
while( pNode || !path.empty())
{
if(pNode)
{
path.push(pNode);
pNode=pNode->pLeft;
}
else
{
if(pLastVisited==path.top()->pRight)
{
if(path.top()==pTarget)
return true;
pLastVisited=path.top();
path.pop();
}
else
{
pNode=path.top()->pRight;
pLastVisited=NULL;
}
}
}
return false;
}
int main()
{
binaryTreeNode n1,n2,n3,n4,n5,n6,n7,n8;
n1.value=8,n2.value=6,n3.value=10,n4.value=5,n5.value=7,n6.value=9,n7.value=11,n8.value=20;
n1.pLeft=&n2,n1.pRight=&n3;
n2.pLeft=&n4,n2.pRight=&n5;
n3.pLeft=&n6,n3.pRight=&n7;
n4.pLeft=NULL,n4.pRight=NULL;
n5.pLeft=&n8,n5.pRight=NULL;
n6.pLeft=NULL,n6.pRight=NULL;
n7.pLeft=NULL,n7.pRight=NULL;
n8.pLeft=NULL,n8.pRight=NULL;
binaryTreeNode *pRoot=&n1;
stack<binaryTreeNode *> path1,path2;
getNodePath(pRoot,&n4,path1);
getNodePath(pRoot,&n8,path2);
stack<binaryTreeNode *> path1_reverse,path2_reverse;
while(!path1.empty())
{
path1_reverse.push(path1.top());
path1.pop();
}
while(!path2.empty())
{
path2_reverse.push(path2.top());
path2.pop();
}
binaryTreeNode *lowestCommanAncestor;
while(!path1_reverse.empty() && !path2_reverse.empty())
{
if(path1_reverse.top()==path2_reverse.top())
{
lowestCommanAncestor=path1_reverse.top();
path1_reverse.pop();
path2_reverse.pop();
}
else
{
break;
}
}
cout<<lowestCommanAncestor<<endl;
cout<<lowestCommanAncestor->value<<endl;
return 0;
}
|