7-14 二叉搜索樹的最近公共祖先 (30 分)

題目連接:https://pintia.cn/problem-sets/1110382478542622720/problems/1110382589284831244node

題目大意:c++

給定一棵二叉搜索樹的先序遍歷序列,要求你找出任意兩結點的最近公共祖先結點(簡稱 LCA)。spa

輸入格式:

輸入的第一行給出兩個正整數:待查詢的結點對數 M(≤ 1 000)和二叉搜索樹中結點個數 N(≤ 10 000)。隨後一行給出 N 個不一樣的整數,爲二叉搜索樹的先序遍歷序列。最後 M 行,每行給出一對整數鍵值 U 和 V。全部鍵值都在整型int範圍內。code

輸出格式:

對每一對給定的 U 和 V,若是找到 A 是它們的最近公共祖先結點的鍵值,則在一行中輸出 LCA of U and V is A.。但若是 U 和 V 中的一個結點是另外一個結點的祖先,則在一行中輸出 X is an ancestor of Y.,其中 X 是那個祖先結點的鍵值,Y 是另外一個鍵值。若是 二叉搜索樹中找不到以 U 或 V 爲鍵值的結點,則輸出 ERROR: U is not found. 或者 ERROR: V is not found.,或者 ERROR: U and V are not found.blog

具體思路:若是是一棵二叉樹的先序遍歷的話,是建不出樹來的,可是這是一顆二叉搜索樹,知足左小右大,因此就能夠建出樹來了。而後建樹的時候,保存每一個節點的左節點,右節點,父親節點。判斷lca的時候,咱們對當前的點往上搜就能夠了。get

注意離散化的下標。it

AC代碼:class

 1 #include<bits/stdc++.h>
 2 using namespace std;  3 # define ll long long
 4 const int maxn = 2e4+100;  5 struct node  6 {  7     int lt;  8     int rt;  9     int fa;  10 } q[maxn];  11 int a[maxn],b[maxn];  12 void add(int rt,int val)  13 {  14     if(!rt)  15         return ;  16     if(rt>val)  17  {  18         if(q[rt].lt)  19  add(q[rt].lt,val);  20         else
 21  {  22             q[rt].lt=val;  23             q[val].fa=rt;  24             return ;  25  }  26  }  27     else
 28  {  29         if(q[rt].rt)  30  add(q[rt].rt,val);  31         else
 32  {  33             q[rt].rt=val;  34             q[val].fa=rt;  35             return ;  36  }  37  }  38 }  39 int vis[maxn],ans;  40 void  Find(int t)  41 {  42     if(!t)  43         return ;  44     if(vis[t])  45  {  46         ans=t;  47         return ;  48  }  49     vis[t]=1;  50  Find(q[t].fa);  51 }  52 int main()  53 {  54     int n,m;  55     scanf("%d %d",&m,&n);  56     for(int i=0; i<=10000; i++)  57  {  58         q[i].lt=0;  59         q[i].rt=0;  60         q[i].fa=0;  61  }  62     for(int i=1; i<=n; i++)  63  {  64         scanf("%d",&a[i]);  65         b[i]=a[i];  66  }  67     sort(b+1,b+n+1);  68     int rt;  69     for(int i=1; i<=n; i++)  70  {  71         a[i]=lower_bound(b+1,b+n+1,a[i])-b;  72         if(i==1)  73             rt=a[i];  74         else
 75  add(rt,a[i]);  76  }  77     for(int i=1; i<=m; i++)  78  {  79         int st,ed;  80         scanf("%d %d",&st,&ed);  81         int s1=lower_bound(b+1,b+n+1,st)-b;  82         int s2=lower_bound(b+1,b+n+1,ed)-b;  83         if(b[s1]!=st&&b[s2]!=ed)  84             printf("ERROR: %d and %d are not found.\n",st,ed);  85         else if(b[s1]!=st)  86             printf("ERROR: %d is not found.\n",st);  87         else if(b[s2]!=ed)  88             printf("ERROR: %d is not found.\n",ed);  89         else
 90  {  91  Find(s1);  92             if(vis[s2])  93                 printf("%d is an ancestor of %d.\n",ed,st);  94             else
 95  {  96  Find(s2);  97                 if(ans==s1)  98                     printf("%d is an ancestor of %d.\n",st,ed);  99                 else
100                     printf("LCA of %d and %d is %d.\n",st,ed,b[ans]); 101  } 102  } 103         memset(vis,0,sizeof(vis)); 104         ans=0; 105  } 106 }
相關文章
相關標籤/搜索