LCA (Lowest Common Ancestor)问题
#include<iostream>
using namespace std;
struct Node
{
Node *left;
Node *right;
int value;
Node(int val)
{
value=val;
left=NULL;
right=NULL;
}
};
int path1[1005];//里面存放a到根节点的路径
int path2[1005];//里面存放b到根节点的路径
int top1=-1,top2=-1;//getPath中从path1[0]开始填充
void createTree(Node *& par)//表示可以函数可以修改实参par
{
int tmp_val;
cin>>tmp_val;
if(tmp_val==0)//终止条件是该节点为0
par = NULL;
else
{
par = new Node(tmp_val);//给par所指的位置建个房子,里面把left,right填上NULL,再递归下去为par->left,par->right建房子
createTree(par->left);//为底层的par->left建房子
createTree(par->right);//为底层的par->right建房子
}
}
bool getPath(Node *root,int x,int &top,int path[1005])
{//如果x在树中的话,则处理完后path[0]=树根,path[top]=x
path[++top]=root->value;
if(root->value==x)
return true;
else
{
bool flag=false;
if(root->left!=NULL)
flag=getPath(root->left,x,top,path);
if(flag==false&&root->right!=NULL)
flag=getPath(root->right,x,top,path);
if(flag==false)
top--;
return flag;
}
}
int findCommonParent()//找两个数组中最后一个相同的元素
{
int comPar;
int loc1=0,loc2=0;
while(loc1<=top1&&loc2<=top2)
{
if(path1[loc1]==path2[loc2])
comPar=path1[loc1];
loc1++;//loc1++不能放到if(path1[loc1]==path2[loc2])中,
loc2++;//因为这样会让path1[loc1]!=path2[loc2]后loc1,loc2不再增加,死循环
}
return comPar;
}
int main()
{
int N;
cin>>N;
while(N--)
{
Node *root;
createTree(root);
int a,b;
cin>>a>>b;
top1=top2=-1;
if(getPath(root,a,top1,path1)==false)
{
cout<<"My God"<<endl;
continue;
}
if(getPath(root,b,top2,path2)==false)
{
cout<<"My God"<<endl;
continue;
}
cout<<findCommonParent()<<endl;
}
return 0;
}
/**************************************************************
Problem: 1509
User: zhangmengjlu
Language: C++
Result: Accepted
Time:230 ms
Memory:5356 kb
****************************************************************/