后续遍历即可,这样每次处理当前节点时,可以综合左右节点的信息进行处理。时间复杂度为O(n)
PS : 经查找维基百科LCA的定义,一个节点可以称为他自己的子节点。
注意:以下代码九度上第五个case没过
#include<iostream>
using namespace std;
struct Node{
int val;
Node * left;
Node * right;
Node (int value){
val = value;
left = NULL;
right = NULL;
}
};
Node * createTree(){
int value;
cin>>value;
if(value == 0) return NULL;
Node *root = new Node(value);
root->left = createTree();
root->right = createTree();
return root;
}
void destroy(Node * root){
if(root == NULL) return ;
Node * l = root->left;
Node * r = root->right;
delete root;
destroy(l);
destroy(r);
}
int findLCA(Node * root, int m1, int m2, int &value){
if(root == NULL || m1 == 0 || m2 == 0) return 0;
int findleft = 0, findright = 0, mid = 0;
findleft = findLCA(root->left, m1, m2, value);
if(findleft < 2)
findright = findLCA(root->right, m1, m2, value);
if(root->val == m1 && root->val == m2)
mid = 2;
else if(root->val == m1 || root->val == m2)
mid = 1;
if(findleft == 1 && findright == 1 ){
value = root->val;
return 2;
}
if((findleft == 1 || findright == 1) && mid == 1){
value = root->val;
return 2;
}
if(mid == 2){
value = root->val;
return 2;
}
return findleft | findright | mid;
}
int main(){
int n;
int m1, m2, value;
cin>>n;
while(n--){
Node * root = createTree();
cin>>m1>>m2;
value = 0;
findLCA(root, m1, m2, value);
if(value != 0)
cout<<value<<endl;
else
cout<<"My God"<<endl;
destroy(root);
}
return 0;
}
ps 贴一个九度内部AC的代码 ,花了我20个九度豆买的,奶奶的
#include<stdio.h>
#define N 10005
int tree[N][4],e;
int find(int x){
int i;
for(i=0;i<=e;i++)
if(tree[i][3]==x)
return i;
return -1;
}
void build(int a)
{
int temp;
scanf("%d",&temp);
if(temp)
{
tree[a][1]=e;
tree[e][3]=temp;
tree[e][0]=a;
e++;
build(e-1);
}
scanf("%d",&temp);
if(temp)
{
tree[a][2]=e;
tree[e][3]=temp;
tree[e][0]=a;
e++;
build(e-1);
}
}
int main()
{
int n,i,m1,m2,s1,s2,t1,t2,c1,c2,c;
while(scanf("%d",&n)!=EOF)
{
while(n--)
{
e=1;
scanf("%d",&tree[0][3]);
tree[0][0]=-1;
build(0);
scanf("%d %d",&m1,&m2);
s1=s2=-1;
s1=find(m1);
s2=find(m2);
if(s1!=-1&&s2!=-1)
{
t1=s1;
t2=s2;
c1=c2=0;
while(tree[t1][0]!=-1)
{
c1++;
t1=tree[t1][0];
}
while(tree[t2][0]!=-1)
{
c2++;
t2=tree[t2][0];
}
if(c1>c2)
{
c=c1-c2;
while(c--)
s1=tree[s1][0];
}
if(c2>c1)
{
c=c2-c1;
while(c--)
s2=tree[s2][0];
}
while(s1!=s2)
{
s1=tree[s1][0];
s2=tree[s2][0];
}
printf("%d
",tree[s1][3]);
}
else
printf("My God
");
}
}
return 0;
}
/**************************************************************
Problem: 1509
User: 282544883
Language: C
Result: Accepted
Time:90 ms
Memory:1068 kb
****************************************************************/