A 1143 Lowest Common Ancestor (30分)

一、技术总结

  1. 题目的意思就是找到,给出两个结点的最小的祖先结点,其实这题关键就是,它是一棵搜索二叉树,我们只要发现有个结点是在给出的两个结点之间,那么这个结点就一定是最小的最先结点。
  2. 使用map< int , bool > mp,用于接收二叉树的结点,用于遍历找到那个加在所给结点的祖先结点。;最后就是按照题意进行输出即可。

二、参考代码

#include
#include
#include
using namespace std;
map mp;
int main(){
	int m, n, u, v, a;
	scanf("%d%d", &m, &n);
	vector 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) 
//			cout << u << " " << v << endl;
			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;
}

你可能感兴趣的:(A 1143 Lowest Common Ancestor (30分))