通过dfs,分别求出从根节点到两个节点的路径,然后比较分析
结果29分 2号测试点段错误
#include<iostream>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std;
const int maxn = 1e4 + 10;
int n, m;
int in[maxn], pre[maxn], visit[maxn] = { 0 };
struct node {
int v;
node* l, * r;
}tree[maxn];
node* Create(int root, int il, int ir) {
if (il > ir) { return NULL; }
node* t = new node;
t->v = pre[root];
visit[pre[root]] = 1;
int p = il;
while (p <= ir && in[p] != pre[root]) { p++; }
t->l = Create(root + 1, il, p - 1);
t->r = Create(root + (p - il) + 1, p + 1, ir);
return t;
}
//求从根节点到值为v的节点的路径
vector<int> path1, path2;
void dfs(node* root, int v, vector<int>& path, int& flag) {
path.push_back(root->v);
if (root->v == v) {
flag = 1;
return;
}
if (root->l != NULL && !flag) {
dfs(root->l, v, path, flag);
if (flag) { return; }
path.pop_back();
}
if (root->r != NULL && !flag) {
dfs(root->r, v, path, flag);
if (flag) { return; }
path.pop_back();
}
return;
}
int main() {
cin >> m >> n;
for (int i = 0; i < n; i++) { cin >> in[i]; }
for (int i = 0; i < n; i++) { cin >> pre[i]; }
node* root = NULL;
root = Create(0, 0, n - 1);
while (m--) {
int a, b, f1 = 0, f2 = 0;
cin >> a >> b;
if (visit[a] == 0) { f1 = 1; }
if (visit[b] == 0) { f2 = 1; }
if (f1 == 1 && f2 == 1) { printf("ERROR: %d and %d are not found.\n", a, b); }
else if (f1 == 1) { printf("ERROR: %d is not found.\n", a); }
else if (f2 == 1) { printf("ERROR: %d is not found.\n", b); }
else {
path1.clear();
path2.clear();
int f1 = f2 = 0;
dfs(root, a, path1, f1);
dfs(root, b, path2, f2);
int i = 0;
while (i < path1.size() && i < path2.size() && path1[i] == path2[i]) { i++; }
i--;//此时i为两数组的最后一个公共值的下标
if (i == path1.size()-1) { printf("%d is an ancestor of %d.\n", a, b); }
else if (i == path2.size()-1) { printf("%d is an ancestor of %d.\n", b, a); }
else { printf("LCA of %d and %d is %d.\n", a, b, path1[i]); }
}
}
return 0;
}