PAT A1143 Lowest Common Ancestor [二叉搜索树LCA]

题目描述

链接
给出一棵二叉搜索树的前序遍历,问结点u和v的共同最低祖先是谁

分析

  • 二叉搜索树的中序遍历是将结点排序后的顺序,现在又给了前序,此时可以唯一确定出二叉搜索树
  • 二叉搜索树的性质是左边的比a小,右边的比a大,此时说明a是左右子树的祖先,但不一定是最近
  • 前序遍历的话是LDR,map<int, bool> mp用来标记树中所有出现过的结点,遍历一遍pre数组,将当前结点标记为a,如果u和v分别在a的左、右,或者u、v其中一个就是当前a,即(a >= u && a <= v) || (a >= v && a <= u),说明找到了这个共同最低祖先a,退出当前循环!!!!

代码

#include<bits/stdc++.h>
using namespace std;


const int maxn = 1e4+10;
int pre[maxn], m, n, u, v, a;
map<int, bool> mp;

int main(){
    scanf("%d%d",&m,&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<=u && a>=v) break;
        }
        if(mp[u] == false && mp[v] == false){
            printf("ERROR: %d and %d are not found.
", u, v);
        }else if(mp[u] == false){
            printf("ERROR: %d is not found.
", u);
        }else if(mp[v] == false){
            printf("ERROR: %d is not found.
", v);
        }else{
            if(a == u || a == v){
                printf("%d is an ancestor of %d.
", a==u?u:v, a==u?v:u);
            }else{
                printf("LCA of %d and %d is %d.
", u,v,a);
            }
        }
    }
}
原文地址:https://www.cnblogs.com/doragd/p/11382716.html