1143 Lowest Common Ancestor 甲级
生活随笔
收集整理的這篇文章主要介紹了
1143 Lowest Common Ancestor 甲级
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
給出一棵二叉搜索樹的前序遍歷,問結點u和v的共同最低祖先是誰,利用先序遍歷特點。
二叉搜索樹滿足:
節點的左子樹只包含鍵小于節點鍵的節點。
節點的鍵只包含節點的右鍵大于或等于子樹的節點的鍵。
左子樹和右子樹也必須是二叉搜索樹。
題解:
樣例:
6 3 1 2 5 4 8 7
根據題目要求我們可以得到:
紅字則是該數字在前序遍歷中出現的順序(從0開始)
我們可以從題目要求下手,在本題中,根的左子樹總是小于根,右子樹總是大于根
查詢u和v的lca,如果一個x(x不與u和v重合)同時滿足x>u,x<v,說明u在x的左邊,v在x的右邊,那說明x就是u和v的lca
同理。x<u,x>v也是
當然x和u或v重合時也是
代碼:
#include<bits/stdc++.h> using namespace std; map<int,bool> mp; int main(){int m,n,u,v,a;cin>>m>>n;vector<int> pre(n);for (int i=0;i<n;i++){cin>>pre[i];mp[pre[i]]=true;}for (int i=0;i<m;i++){cin>>u>>v;for (int j=0;j<n;j++){a=pre[j];if ((a>u&&a<v)||(a>v&&a<u)||(a==u)||(a==v))break;}if (mp[u]==false&&mp[v]==false)printf("ERROR: %d and %d are not found.\n",u,v);else if (mp[u] == false || mp[v] == false)printf("ERROR: %d is not found.\n", mp[u] == false ? u : v);else if (a == u || a == v)printf("%d is an ancestor of %d.\n", a, a == u ? v : u);elseprintf("LCA of %d and %d is %d.\n", u, v, a);}return 0; }總結
以上是生活随笔為你收集整理的1143 Lowest Common Ancestor 甲级的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT 1152 Google Recr
- 下一篇: 1151 LCA in a Binary