二叉搜索树找第一个祖先结点。
坑点如下
1,先序遍历,找到的第一个符合要求的结点一定是二者的最小祖先结点
证明如下
如果两数分布在根结点两端,直接找到,如果两数在左子树,则按根左右可找到,如果都在右子树,则根左找完后均找不到,之后再找右子树,一定能找到。
整体代码如下
2,set容器中的元素自动排序
#include<bits/stdc++.h>
using namespace std;
map<int,int>d;
int main(){
int m,n,k1,k2,l,a;
scanf("%d%d",&m,&n);
vector<int>pre(n);
for(int i=0;i<n;i++)
{ scanf("%d",&pre[i]);
d[pre[i]]=i+1;}
for(int i=0;i<m;i++){
scanf("%d%d",&k1,&k2);
if(d.find(k1)==d.end()&&d.find(k2)==d.end())
printf("ERROR: %d and %d are not found.\n",k1,k2);
else if(d.find(k1)==d.end()||d.find(k2)==d.end())
printf("ERROR: %d is not found.\n",d.find(k1)==d.end()?k1:k2);
else
{for(l=0;l<n;l++)
{ a=pre[l];
if((a>k1&&a<k2)||(a>k2&&a<k1)||(a==k1||a==k2))
break;
}
if((a>k1&&a<k2)||(a>k2&&a<k1))
printf("LCA of %d and %d is %d.\n",k1,k2,pre[l]);
if(a==k1||a==k2)
{
printf("%d is an ancestor of %d.\n",a,a==k1?k2:k1);
}
}
}
return 0;
}