PAT1143


title: PAT1143
date: 2021-01-22 20:03:07
tags: PAT


1143

題目:

BST構建,LCA判斷惕虑,前序遍歷

范圍:

結點數(shù)N < 10000
判斷數(shù)M < 1000

分析:

  • 實際上BST構建這一步是多的,不需要構建即可知道迹缀,前序遍歷中LCA必在兩個結點的前面
  • 如果要在給出的BST查找結點是否存在空另,會有一個樣例超時漾岳,因為可能給出的是不平衡的樹,所以需要建map查找

解法:

前序遍歷判斷LCA必在兩個結點的前面瞭亮,所以依次查看前序遍歷的結點方仿,找到夾在查找到兩個結點大小的點即可退出

代碼:

差一個超時樣例

#include<iostream>
#include<math.h>
#include<algorithm>

using namespace std; 

struct node{
    int val; 
    int idx; 
    int l_child, r_child; 
};

int M, N; 
node tree[10005]; 

void make_BST(int root){
    if(root == -1) return; 
    int root_val = tree[root].val; 
    int l = -1, r = -1; 
    for(int i = root + 1; i < N; i++){
        if(tree[i].val < root_val){
            l = i;
            break;  
        }
    }
    for(int i = root + 1; i < N; i++){
        if(tree[i].val > root_val){
            r = i;
            break;  
        }
    }
    tree[root].l_child = l; 
    tree[root].r_child = r;
    make_BST(l); 
    make_BST(r); 
    return; 
}

int find_idx(int idx, int val){
    if(idx == -1) return -1; 
    if(val == tree[idx].val) return idx; 
    else if(val < tree[idx].val) {
        return find_idx(tree[idx].l_child, val); 
    }
    else return find_idx(tree[idx].r_child, val); 
    // for(int i = 0; i < N; i++){
    //     if(tree[i].val == val) return i; 
    // }
    // return -1; 
}

void find_ancestor(int u, int v){
    
    int a; 
    for(int i = 0; i < N; i++){
        // cout<<1<<endl; 
        a = tree[i].val; 
        if((a <= u && a >= v) || (a <= v && a >= u)) {
            break;
        }
    }
    if (a == u || a == v) printf("%d is an ancestor of %d.\n", a, a == u ? v : u);
    else printf("LCA of %d and %d is %d.\n", u, v, a);
    return; 
}

int main()
{
    freopen("1143_in", "r", stdin); 
    cin>>M>>N; 
    for(int i = 0; i < N; i++){
        cin>>tree[i].val;
        tree[i].idx = i; 
        tree[i].l_child = -1; 
        tree[i].l_child = -1; 
    }
    make_BST(0); 
    for(int i = 0; i < M; i++){
        int a, b, a_idx, b_idx; 
        cin>>a>>b; 
        a_idx = find_idx(0, a);
        b_idx = find_idx(0, b);
        //Erro print
        if(a_idx == -1 || b_idx == -1){
            if(a_idx == -1 && b_idx == -1) printf("ERROR: %d and %d are not found.\n", a, b); 
            else if(a_idx == -1) printf("ERROR: %d is not found.\n", a); 
            else printf("ERROR: %d is not found.\n", b); 
        }
        else {
            find_ancestor(a, b); 
        }
    }
    return 0; 
}

網(wǎng)上完美答案(相當簡潔而且只有30行)

#include <iostream>
#include <vector>
#include <map>
using namespace std;
map<int, bool> mp;
int main() {
    int m, n, u, v, a;
    scanf("%d %d", &m, &n);
    vector<int> pre(n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &pre[i]);
        mp[pre[i]] = true;
    }
    for (int i = 0; i < m; i++) {
        scanf("%d %d", &u, &v);
        for(int j = 0; j < n; j++) {
            a = pre[j];
            if ((a >= u && a <= v) || (a >= v && a <= u)) 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);
        else
            printf("LCA of %d and %d is %d.\n", u, v, a);
    }
    return 0;
}
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市统翩,隨后出現(xiàn)的幾起案子仙蚜,更是在濱河造成了極大的恐慌,老刑警劉巖厂汗,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件委粉,死亡現(xiàn)場離奇詭異,居然都是意外死亡娶桦,警方通過查閱死者的電腦和手機贾节,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衷畦,“玉大人栗涂,你說我怎么就攤上這事∑碚” “怎么了斤程?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長菩混。 經(jīng)常有香客問我忿墅,道長扁藕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任疚脐,我火速辦了婚禮亿柑,結果婚禮上,老公的妹妹穿的比我還像新娘棍弄。我一直安慰自己望薄,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布呼畸。 她就那樣靜靜地躺著式矫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪役耕。 梳的紋絲不亂的頭發(fā)上采转,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音瞬痘,去河邊找鬼故慈。 笑死,一個胖子當著我的面吹牛框全,可吹牛的內(nèi)容都是我干的察绷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼津辩,長吁一口氣:“原來是場噩夢啊……” “哼拆撼!你這毒婦竟也來了?” 一聲冷哼從身側響起喘沿,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤闸度,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蚜印,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莺禁,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年窄赋,在試婚紗的時候發(fā)現(xiàn)自己被綠了哟冬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡忆绰,死狀恐怖浩峡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情错敢,我是刑警寧澤翰灾,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響预侯,放射性物質發(fā)生泄漏。R本人自食惡果不足惜峰锁,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一萎馅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虹蒋,春花似錦糜芳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晃虫,卻和暖如春皆撩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哲银。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工扛吞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荆责。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓滥比,卻偏偏與公主長得像,于是被迫代替她去往敵國和親做院。 傳聞我的和親對象是個殘疾皇子盲泛,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容