pat-1143

代码一 有一个点  RE 运行超时此法在中序已知时可以针对一般树

#include<iostream>
#include<map>
#include<vector>
using namespace std;
int main()
{int m,n;
cin>>m>>n;
//如果是二叉树的话就不需要中序了只要抓住按值大小就是中序 
vector<int> pre;
map<int,bool>cp;
pre.resize(n+1);
for(int i=1;i<=n;i++)
{scanf("%d",&pre[i]);
cp[pre[i]]=true;
}
//与这个 i重复声明所以一开始i弄成了0不要重用 
for(int i=0;i<m;i++)
{
	int p1,p2;
	cin>>p1>>p2;
	//此处i应该弄为全局变量因为后面要用到,每一个要用到的变量是局部还是全局要分清不一样(注意) 
	int j=1; 
	for(j;j<=n;j++)
	if(pre[j]>=p1&&pre[j]<=p2||pre[j]<=p1&&pre[j]>=p2) break;

	if(cp[p1]==false&&cp[p2]==false) printf("ERROR: %d and %d are not found.\n",p1,p2);
	else if(cp[p1]==true&&cp[p2]==false||cp[p1]==false&&cp[p2]==true) printf("ERROR: %d is not found.\n",cp[p1]==0?p1:p2);
	else if(pre[j]>p1&&pre[j]<p2||pre[j]<p1&&pre[j]>p2)printf("LCA of %d and %d is %d.\n",p1,p2,pre[j]);
    else if(pre[j]==p1||pre[j]==p2) printf("%d is an ancestor of %d.\n",pre[j]==p1?p1:p2,pre[j]==p1?p2:p1);
}
return 0;

}

 直接针对BST

#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
int m,n;
//pos存入的是中序的位置 
map<int ,int> pos;
vector<int> pre,in;
void lca(int preroot,int inll,int inrr,int ll,int rr)
{  //END  考虑一个节点的情况
   //必须要把输入接口放到外面否则每次递归都会再输入导致错误 没有考虑递归对输入的影响 
    if(inll>inrr) return;
	
	 int inpos=pos[pre[preroot]];
	if(pos[ll]==0&&pos[rr]==0)printf("ERROR: %d and %d are not found.\n",ll,rr);
	else if(pos[ll]==0||pos[rr]==0)printf("ERROR: %d is not found.\n",pos[ll]==0?ll:rr);
    
     //in,pre,入时要都从1开始入 
     //两边不一定谁在那一边都要写上 
     else if(pos[ll]<inpos&&pos[rr]>inpos||pos[ll]>inpos&&pos[rr]<inpos) printf("LCA of %d and %d is %d.\n",ll,rr,in[inpos]);
     else if(pos[ll]<inpos&&pos[rr]<inpos) lca(preroot+1,inll,inpos-1,ll,rr);
     else if(pos[ll]>inpos&&pos[rr]>inpos) lca(preroot+inpos-inll+1,inpos+1,inrr,ll,rr);
     //ll打成11我也是醉了(注意) 
     else if(pos[ll]==inpos) printf("%d is an ancestor of %d.\n",ll,rr);
     else if(pos[rr]==inpos) printf("%d is an ancestor of %d.\n",rr,ll);
	
}
int main()
{
	scanf("%d %d",&m,&n); 
	pre.resize(n+1);
	in.resize(n+1);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&pre[i]);
		//没有两次出入注意不能放一块 注意 
		in[i]=pre[i];
	}
	
	sort(in.begin(),in.end());
	//debug
	//for(int i=0;i<in.size();i++)
	//printf("%d ",in[i]);
	//没有建立键值对
	for(int i=1;i<=n;i++)
	pos[in[i]]=i; 
	for(int i=0;i<m;i++)
	{  int ll,rr;
	   scanf("%d %d",&ll,&rr);
		lca(1,1,n,ll,rr);
	}
	return 0;
}
 

总结

1.第一种方法可针对一般树当知道前序中序时 第二种直接针对二叉树可以直接找到与根节点相关的结点

2.dfs递归与输入的冲突,不能在递归中循环输入,同时要注意在输入一行处理一行中不能有两个输入,要想再弄一个只能用拷贝

3.全局变量i 计数  里面的i局部的是需要的,结果冲突,使用一个变量一定要先清楚他是不是只在局部起作用,不是要改成全局,并且尽量不要与上面变量使用冲突

4.这里使用了键值对标记了他存不存在

英语

总结全局变量局部变量记录清楚 尽量不要与上面变量冲突

猜你喜欢

转载自blog.csdn.net/m0_45359314/article/details/112769140
今日推荐