您的位置:首页 > 其它

5-10 顺序存储的二叉树的最近的公共祖先问题 (25分)

2017-02-23 15:12 453 查看
5-10 顺序存储的二叉树的最近的公共祖先问题   (25分)

设顺序存储的二叉树中有编号为ii和jj的两个结点,请设计算法求出它们最近的公共祖先结点的编号和值。

输入格式:

输入第1行给出正整数nn(\le
1000≤1000),即顺序存储的最大容量;第2行给出nn个非负整数,其间以空格分隔。其中0代表二叉树中的空结点(如果第1个结点为0,则代表一棵空树);第3行给出一对结点编号ii和jj。

题目保证输入正确对应一棵二叉树,且1\le i,j \le n1≤i,j≤n。

输出格式:

如果ii或jj对应的是空结点,则输出
ERROR:
T[x] is NULL
,其中
x
是ii或jj中先发现错误的那个编号;否则在一行中输出编号为ii和jj的两个结点最近的公共祖先结点的编号和值,其间以1个空格分隔。

输入样例1:

15
4 3 5 1 10 0 7 0 2 0 9 0 0 6 8
11 4

输出样例1:

2 3

输入样例2:

15
4 3 5 1 0 0 7 0 2 0 9 0 0 6 8
12 8
#include <bits/stdc++.h>
using namespace std;

int n;
int a[100000],flag;
int findfather(int *a,int i,int j)
{
while(1)
{
if(i>j)
i=i/2;
else
j=j/2;
if(i == j)
{
flag=i;
return a[i];
}
}
}
int main()
{
flag=-1;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
int aa,bb;
scanf("%d%d",&aa,&bb);
int ttt=findfather(a,aa,bb);
if(aa==bb)
cout<<aa<<" "<<a[aa]<<endl;
else if(a[aa]==0)
printf("ERROR: T[%d] is NULL\n",aa);
else if(a[bb]==0)
printf("ERROR: T[%d] is NULL\n",bb);
else
cout<<flag<<" "<<ttt<<endl;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PTA 天梯赛模拟赛