1143 Lowest Common Ancestor (30)自练代码&大神代码

自练代码1:

#include<bits/stdc++.h>//此题有个坑:并没有说节点标号是1~n!! 
using namespace std; //因此绝对不能用数组! 
const int maxn=10010;
map<int,bool> gg;
int m,n,a;
int main(){
	scanf("%d%d",&m,&n);
	vector<int> pre(n);  //!
	for(int i=0;i<n;i++){
		int tmp;
		scanf("%d",&pre[i]);
		gg[pre[i]]=true;
	}
	for(int i=0;i<m;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		int a;
		for(int j=0;j<n;j++){
			a=pre[j];
			if((a>u&&a<v)||(a<u&&a>v)||(a==u||a==v)) break;
		}
		if(gg[u]==false&&gg[v]==false){
			printf("ERROR: %d and %d are not found.\n",u,v);
		} else if(gg[u]==false||gg[v]==false){
			printf("ERROR: %d is not found.\n",gg[u]? v:u);
		} 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;
}

自练代码2:

#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
struct node{
	int data;
	node *right,*left,*father;
};
int m,n,pre[maxn]={0};
vector<int> ori;

void insert(node* &root,int data){
	if(root==NULL){
		root=new node;
		root->data=data;
		root->left=root->right=NULL;
		return ;
	}
	if(data<root->data) insert(root->left,data);
	else insert(root->right,data);
}



int main(){
	scanf("%d%d",&m,&n);
	node* root=NULL;
	for(int i=0;i<n;i++){
		scanf("%d",&pre[i]);
		ori.push_back(pre[i]);
		insert(root,data);
	}
	for(int i=0;i<m;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		judge(a,b);
	}
	return 0;
}

附上某位大神(薛玉洁)的代码:

#include <iostream>    //别人为何这么叼?!:作者透过现象观察到了
#include <vector>     //两最近祖先节点和先序遍历的本质! 
#include <map>         //关键在于它给的是先序的!!决定了可以直接用从root开始的前根 
using namespace std;   //与u、v同时比较即可! 
map<int, bool> mp;       //该序号节点是否被访问(用哈希实现) 
int main() {
    int m, n, u, v, a;  //被测试的组数/bst中的节点数/被测试的两个点序号/先序节点元素 
    scanf("%d %d", &m, &n);//输入被测试的组数和bst中的节点数 
    vector<int> pre(n);  //给先序向量容器初始化n个int空间(声明一个初始大小为n的向量) 
    for (int i = 0; i < n; i++) {   
        scanf("%d", &pre[i]);
        mp[pre[i]] = true;    //每个数都map为true! 
    }
    for (int i = 0; i < m; i++) {  //                 !!核心思想!! 
        scanf("%d %d", &u, &v);
        for(int j = 0; j < n; j++) { //遍历n个bst的节点 
            a = pre[j];
            if ((a > u && a < v)|| (a > v && a < u) || (a == u) || (a == v)) break;
        }  //先直接比较:并完美考虑三种情况! 
        if (mp[u] == false && mp[v] == false)   //再看u,v是否bst树中! 
            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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值