您的位置:首页 > 其它

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

2017-09-22 21:44 936 查看


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

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


输入格式:

输入第1行给出正整数n(≤1000),即顺序存储的最大容量;第2行给出n个非负整数,其间以空格分隔。其中0代表二叉树中的空结点(如果第1个结点为0,则代表一棵空树);第3行给出一对结点编号i和j。
题目保证输入正确对应一棵二叉树,且1≤i,j≤n。


输出格式:

如果i或j对应的是空结点,则输出
ERROR:
T[x] is NULL
,其中
x
是i或j中先发现错误的那个编号;否则在一行中输出编号为i和j的两个结点最近的公共祖先结点的编号和值,其间以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


输出样例2:

ERROR: T[12] is NULL


一条路径放入set  另一条路径查找 

看了别人博客 还有 不断比较 n1/2  n2/2 很妙

#include<stdio.h>
#include<set>
using namespace std;
int a[1010];
int main(){
int n,i,index1,index2;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
scanf("%d",&index1);
scanf("%d",&index2);
if(a[index1]==0){
printf("ERROR: T[%d] is NULL",index1);return 0;
}
else if(a[index2]==0){
printf("ERROR: T[%d] is NULL",index2);return 0;
}
set<int>ans;
int index=index1;
while(index>0){
ans.insert(a[index]);
index=index/2;
}
index=index2;
int value;
while(index>0){
if(ans.find(a[index])!=ans.end()){
value=a[index];break;
}
index=index/2;
}
for(i=1;i<=n;i++){
if(a[i]==value){
printf("%d %d",i,value);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: