04-树4 是否同一棵二叉搜索树 (25分)


#include<iostream> 

using namespace std;  


struct TreeNode{
	int data;
	TreeNode * lchild;
	TreeNode * rchild;
	int flag;//0表示未访问过,1访问过 
};

TreeNode * NewTreeNode(int tmp){
	TreeNode * T=new TreeNode;
	T->data=tmp;  
	T->lchild=T->rchild=NULL;
	T->flag=0;	
	return T; 
}

TreeNode * Insert(TreeNode * T,int tmp){
	if(!T) T=NewTreeNode(tmp);
	else{                        //这个else必须要 
		if(tmp>T->data) T->rchild=Insert(T->rchild,tmp);
		else  T->lchild=Insert(T->lchild,tmp);	
	}

	return T;	
}


TreeNode * MakeTree(int N){
	int tmp; cin>>tmp;	
	TreeNode * T=NewTreeNode(tmp);//创建根节点 
	for(int i=1;i<N;i++){ //创建其它节点 
		cin>>tmp;
		T=Insert(T,tmp);
	} 
	return T;	
} 
  
  
bool Check(TreeNode * T,int tmp){
	
	if(T->flag){
		if(tmp>T->data) return Check(T->rchild,tmp); 
		else if(tmp<T->data)  return Check(T->lchild,tmp); 
		else return false;		
	}else{
		if(tmp==T->data){
			T->flag=1;
			return true;
		}else  return false;
	} 

	
}  
  
bool Judge(TreeNode * T,int N){
	int flag=0;//0表示当前还一致,1表示当前已经不一致 
	int tmp;cin>>tmp;
	if(T->data!=tmp) flag=1;
	else T->flag=1;//访问过
	//cout<<flag<<" "; 
	 
	for(int i=1;i<N;i++){
		cin>>tmp;
		//cout<<Check(T,tmp)<<" ";
		if( (!flag) && (!Check(T,tmp)) ) flag=1; //!flag表示当前还一致, !Check(T,tmp)表示接下来产生了不一致  !要打(),因为!优先级高于&& 
	}
	 
	if(flag) return false;
	else  return true;
}

void Reset(TreeNode * T){
	T->flag=0;
	if(T->lchild) Reset(T->lchild);
	if(T->rchild) Reset(T->rchild);		
}  


void FreeTree(TreeNode * T){
	if(T->lchild) FreeTree(T->lchild);
	if(T->rchild) FreeTree(T->rchild);	
	delete(T);
} 
  
  
int  main(){  
	//freopen("input.txt","r",stdin);
	int N,L;
	cin>>N;   
	while(N){  //if 
	cin>>L;  //这句要在建树之前,因为建树也要读取数据 
	TreeNode * T=MakeTree(N); 

	for(int i=0;i<L;i++){
		if(Judge(T,N)) cout<<"Yes"<<endl;
		else  cout<<"No"<<endl;
		Reset(T);//清除T中标记的flag,都初始化为0	
	}
	
	FreeTree(T); 
	cin>>N;//换一颗树 
	}
	
	
	return 0;  
}  







  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值