• 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);
                }
            }
        }
    }
    
  • 相关阅读:
    一个Bean属性拷贝的工具类
    java Integer parseInt()
    sql 预编译 in
    显著性图谱的评价
    如何优雅的在MFC中使用cvSetMouseCallback?
    为MFC界面添加一个Log Window
    最大流算法统计
    2014年秋 求职总结
    图论的常用算法
    常用的排序算法
  • 原文地址:https://www.cnblogs.com/doragd/p/11382716.html
Copyright © 2020-2023  润新知