顺序存储的二叉树的最近的公共祖先问题

来源:互联网 发布:大数据的未来前景 编辑:程序博客网 时间:2024/04/27 01:35
5-10 顺序存储的二叉树的最近的公共祖先问题   (25分)

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

输入格式:

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

题目保证输入正确对应一棵二叉树,且1\le i,j \le n1i,jn

输出格式:

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

输入样例1:

154 3 5 1 10 0 7 0 2 0 9 0 0 6 811 4

输出样例1:

2 3

输入样例2:

154 3 5 1 0 0 7 0 2 0 9 0 0 6 812 8

输出样例2:

ERROR: T[12] is NULL
#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(){    //int a[n]= {1,2,3,4,5,6,7,8,9,10};    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;}


1 0
原创粉丝点击