问题 B: 二叉搜索树

时间限制: 1 Sec  内存限制: 32 MB
提交: 318  解决: 159
[提交][状态][讨论版][命题人:外部导入]

题目描述

判断两序列是否为同一二叉搜索树序列

输入

开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。

输出

如果序列相同则输出YES,否则输出NO

样例输入

6
45021
12045
54120
45021
45012
21054
50412
0

样例输出

NO
NO
YES
NO
NO
NO

思路:

      判断两颗树是否相等,只需要判断中序和先序序列是否一致就行。用变长数组vector存,方便于判断俩“数组”是否相等。

#include<iostream>
#include<string>
#include<queue>
#include<cmath>
#include<vector>
#include<cstdio>
using namespace std; 

struct node{
	
	int data;
	node* lchild;
	node* rchild;
};
void pre(node* root,vector<int> &v){
	
	if(root==NULL) 
	 return ;
	 
	 v.push_back(root->data);
	 pre(root->lchild,v);
	 pre(root->rchild,v);
}
void in(node* root,vector<int> &v){
	
	if(root==NULL)
	 return ;
	 
	 in(root->lchild,v);
	 v.push_back(root->data);
	 in(root->rchild,v);
	
}
 

void insert(node* &root,int data){
	
	 if(root==NULL){
	 	//root指向空地址,然后让root指向一个具体的地址 
	 	root=new node;
	 	root->data=data;
	 	root->lchild=root->rchild=NULL;
	 	
	 	return ;
	 }
	 //递归边界与递归式,边界一定要记得返回 
	 if(data<root->data)
	   insert(root->lchild,data);
	 else if(data>root->data)
	   insert(root->rchild,data);  
	   
	
}
int main(){

	 int n;
	 string str,str1;
	 while(cin>>n){
	 	
	 	if(!n) break;
	 	//root
	   cin>>str;
	   
	   node* root=NULL;
	   for(int i=0;i<str.size();i++){
	   	    
			int k=str[i]-'0';
	   		insert(root,k);	
	   }
	   
	   vector<int> Pre,In;
	   pre(root,Pre);
	   in(root,In);
	   //else
	   for(int i=0;i<n;i++){
	   	
	   	cin>>str1;
	   	//build a tree
	   	node* root1=NULL;
	    for(int i=0;i<str1.size();i++){
	   	    
			int k=str1[i]-'0';
	   		insert(root1,k);	
	   }
	    
	    //get pre in
	    vector<int> Pre1,In1;
	   	pre(root1,Pre1);
	   	in(root1,In1);
	   	
	   	//judge
	   	if(Pre1==Pre&&In1==In){
	   		
	   		cout<<"YES"<<endl;
		   }
		else{
			
			cout<<"NO"<<endl;
		}   
	   	
	   	
	   }
	 	
	 }
 
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值