您的位置:首页 > 其它

题目1509:树中两个结点的最低公共祖先

2015-09-08 16:20 337 查看
http://ac.jobdu.com/problem.php?pid=1509

题目描述:

给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先。

输入:

输入可能包含多个测试样例。

对于每个测试案例,输入的第一行为一个数n ,n<1000,代表测试样例的个数。

其中每个测试样例包括两行,第一行为一个二叉树的先序遍历序列,其中左右子树若为空则用0代替,其中二叉树的结点个数node_num<10000。

第二行为树中的两个结点的值m1与m2 m1,m2<10000。

输出:

对应每个测试案例,

输出给定的树中两个结点的最低公共祖先结点的值,若两个给定结点无最低公共祖先,则输出“My God”。

样例输入:

2

1 2 4 6 0 0 7 0 0 5 8 0 0 9 0 0 3 0 0

6 8

1 2 4 6 0 0 7 0 0 5 8 0 0 9 0 0 3 0 0

6 12

样例输出:

2

My God

// http://ac.jobdu.com/problem.php?pid=1509 #include<stdio.h>
#include<stack>
#include<iostream>
using namespace std;

#define N 10005

typedef struct node{
int data;
struct node *left,*right;
node(int _data = -1)
{
data = _data ;
left = NULL;
right = NULL;
}
}Bnode;

bool shu
;

Bnode* createTree(Bnode* head)
{
int data ;
scanf("%d",&data); // 每次都需要输入数据
if(data == 0)
{
return NULL ;
}else{
head = new node(data);
shu[data] = true ;
head->left = createTree(head->left); // 递归 左子树
head->right = createTree(head->right); // 递归 右子树
}
return head ;
}

int Apre
,Bpre
; // 先序遍历查找A B 时每个节点的parent
int fa,fb;
bool oka,okb;

void finda(Bnode* head)
{
if(oka)
return ;
if(head->data == fa)
{
oka = true;
return ;
}
if(head->left != NULL)
{
if(head->left->data != head->data)
Apre[head->left->data] = head->data; //
finda(head->left) ; // 递归查找
}
if(head->right != NULL)
{
if(head->right->data != head->data)
Apre[head->right->data] = head->data;
finda(head->right) ; // 递归查找
}
}
void findb(Bnode* head)
{
if(okb)
return ;
if(head->data == fb)
{
okb = true;
return ;
}
if(head->left != NULL)
{
if(head->left->data != head->data)
Bpre[head->left->data] = head->data;
findb(head->left) ;
}
if(head->right != NULL)
{
if(head->right->data != head->data)
Bpre[head->right->data] = head->data;
findb(head->right) ;
}
}

int main()
{
// freopen("in.txt","r",stdin);
int t;
while(scanf("%d",&t)!=EOF)
while(t--)
{
int i ;
for(i = 0 ; i <= 10000 ; i ++){
shu[i] = false;
Apre[i] = -1;
Bpre[i] = -1;
}
Bnode* head = NULL;
head = createTree(head);
oka = false;
okb = false ;
scanf("%d%d" , &fa , &fb);
if(shu[fa] == false || shu[fb] == false)
{
printf("My God\n");
}else{
finda(head);
stack<int> sta; // 存放fa和他的所有祖先
int p = fa;
sta.push(p);
while(Apre[p] != -1)
{
p = Apre[p];
sta.push(p);
}

findb(head);
stack<int> stb; // 存放fb和他的所有祖先
p = fb;
stb.push(p);
while(Bpre[p] != -1)
{
p = Bpre[p];
stb.push(p);
}

int root = -1 ;
// 找最近的公共祖先
while(!sta.empty() && !stb.empty() && sta.top() == stb.top())
{
root = sta.top();
sta.pop();
stb.pop();
}
if(root == -1)
printf("My God\n");
else
printf("%d\n",root);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: