艰难的英语单词:insensitive 英 [ɪnˈsensətɪv] adj.不敏感的; 感觉迟钝的;文章管理
题意:给一个BST(二叉搜索树或叫二叉排序树),给的是先序遍历,然后好几个查询,给出两个数,问这两个数的最小祖先是多少,最小祖先就是——深度最低的最接近这两个点的祖先咯,然后更具情况不同输出不同即可。
难点:1、根据先序遍历建立BST,我是用链表的形式
2、判断一下两个数在不在BST里,就是用BST的性质去遍历查询咯
3、最小祖先,在纸上画一下,就知道,如果给出的两个数,一个在当前点的左子树,另一个数在当前点的右子树,那当前点肯定就是最小祖先咯。(当前前提是这两个数都在本BST中)
按照本思路去写代码,就OK咯
Code:
#include<cstdio>
#include<iostream>
#include<cstring>
#define inf 999
#define INF 0x3f3f3f3f
int n,m;//点和查询数
int A,B;//A小B大
struct Node//节点
{
int v;
Node *left,*right;
Node()
{
left=right=NULL;
}
Node(int value)
{
v=value;
left=right=NULL;
}
};
void insert(Node *h,int v)//建立BST
{
if(v<h->v)
{
if(h->left==NULL)
{
Node *u=new Node(v);
h->left=u;
}
else
insert(h->left,v);
}
else
{
if(h->right==NULL)
{
Node *u=new Node(v);
h->right=u;
}
else
insert(h->right,v);
}
}
int find(Node *h,int v)//判断这个点在不在BST中
{
if(h==NULL)return false;
if(v==h->v)return true;
if(v<h->v)return find(h->left,v);
else return find(h->right,v);
}
int find_father(Node *h)//找他们爸
{
if(A<h->v&&B>=h->v)return h->v;//当左边为A右边为B即为找到
if(A<h->v&&B<h->v)return find_father(h->left);//都在左子树
if(A>h->v&&B>h->v)return find_father(h->right);//都在右子树
}
void init()
{
int i;
int father=0;
scanf("%d%d",&m,&n);
Node *root=NULL;//根
for(i=0;i<n;i++)
{
int t;
scanf("%d",&t);
if(!i)//根
root=new Node(t);
else
insert(root,t);
}
for(i=0;i<m;i++)
{
scanf("%d%d",&A,&B);
int tag=0;//不合法性
if(!find(root,A))tag=1;
if(!find(root,B))tag+=2;
switch(tag)
{
case 0://都存在
father=find_father(root);
if(father==A)
printf("%d is an ancestor of %d.\n",A,B);
else if(father==B)
printf("%d is an ancestor of %d.\n",B,A);
else
printf("LCA of %d and %d is %d.\n",A,B,father);
break;
case 1://A不存在
printf("ERROR: %d is not found.\n",A);
break;
case 2://B不存在
printf("ERROR: %d is not found.\n",B);
break;
case 3://都不存在
printf("ERROR: %d and %d are not found.\n",A,B);
break;
}
}
}
int main()
{
init();
return 0;
}