1043 Is It a Binary Search Tree

#include<bits/stdc++.h>
using namespace std;
struct Node{
	int data;
	Node* left;
	Node* right;
	Node(){
		left=NULL;right=NULL;
	}
};
bool cmp(int a,int b){
    return a>b;
}
vector<int> pre,in,pos;
Node* judge1_build(int prel,int prer,int inl,int inr,int &flag){
	if(prel>prer) return NULL;
	Node* root=new Node;
	root->data=pre[prel];
	int k;
	for(int i=inl;i<=inr;i++){
		if(in[i]==pre[prel]){
			k=i;break;
		}
	}
	int numleft=k-inl;
	int numright=inr-k;
	for(int i=prel+1;i<=prel+numleft;i++){
		if(pre[i]>=root->data){
            flag=1;break;
        }
	}
	for(int i=prel+numleft+1;i<=prer;i++){
		if(pre[i]<root->data){
            flag=1;break;
        } 
	}
    if(flag==1) return NULL;
	root->left=judge1_build(prel+1,prel+numleft,inl,k-1,flag);
	root->right=judge1_build(prel+numleft+1,prer,k+1,inr,flag);
	return root;
}
Node* judge2_build(int prel,int prer,int inl,int inr,int &flag){
	if(prel>prer) return NULL;
	Node* root=new Node;
	root->data=pre[prel];
	int k;
	for(int i=inr;i>=inl;i--){
		if(in[i]==pre[prel]){
			k=i;break;
		}
	}
	int numleft=k-inl;
	int numright=inr-k;
	for(int i=prel+1;i<=prel+numleft;i++){
		if(pre[i]<root->data){
            flag=1;break;
        }
	}
	for(int i=prel+numleft+1;i<=prer;i++){
		if(pre[i]>=root->data){
            flag=1;break;
        } 
	}
    if(flag==1) return NULL;
	root->left=judge2_build(prel+1,prel+numleft,inl,k-1,flag);
	root->right=judge2_build(prel+numleft+1,prer,k+1,inr,flag);
	return root;	
}
void postra1(Node* root){
	if(root==NULL) return;
	postra1(root->left);
	postra1(root->right);
	pos.push_back(root->data);
}
void postra2(Node* root){
	if(root==NULL) return;
	postra2(root->left);
    postra2(root->right);
	pos.push_back(root->data);
}	
int main()
{
	freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
	int n;
	cin>>n;pre.resize(n);
	for(int i=0;i<n;i++){
		cin>>pre[i];
	}
	in=pre;
	sort(in.begin(),in.end());
	int flag=0;
	Node* root;
	if(pre[1]<pre[0]){
		root=judge1_build(0,n-1,0,n-1,flag);
		if(flag==1) cout<<"N0";
		else{
			postra1(root);
		}
	}else{
        sort(in.begin(),in.end(),cmp);
		root=judge2_build(0,n-1,0,n-1,flag);
		if(flag==1) cout<<"N0";
		else{
			postra2(root);
		}
	} 
	if(flag!=1){
        cout<<"YES"<<endl;
		for(int i=0;i<pos.size();i++){
			if(i==0) cout<<pos[i];
			else cout<<' '<<pos[i];
		}
	}
	return 0;
}

当根节点只有左子树或右子树的情况时在这段代码还没办法通过,目前这段代码22分,剩下三分应该就是刚才那种情况,因为这里判断镜像与否的条件时第二个节点值与第一个节点值的大小判断,根节点如果只有左子树或者右子树的时候有点麻烦,待解决......

这里在建树的时候判断子树节点值与根节点的关系来进行判断是否符合BST特征,传一个flag来进行判断。

#include<bits/stdc++.h>
using namespace std;
struct Node{
	int data;
	Node* left;
	Node* right;
};
int n;
vector<int> pre,mipre,pos,mipos;
void build(Node* &root,int num){
	if(root==NULL){
		root=new Node;
		root->data=num;
		root->left=root->right=NULL;return;
	}
	if(num<root->data){
		build(root->left,num);
	}else{
		build(root->right,num);
	}
}
void postra(Node* root){
	if(root==NULL) return;
	postra(root->left);
	postra(root->right);
	pos.push_back(root->data);
}
void mipostra(Node* root){
	if(root==NULL) return;
	mipostra(root->right);
	mipostra(root->left);
	mipos.push_back(root->data);
}
void pretra(Node* root){
	if(root==NULL) return;
	pre.push_back(root->data);
	pretra(root->left);
	pretra(root->right);
}
void mipretra(Node* root){
	if(root==NULL) return;
	mipre.push_back(root->data);
	mipretra(root->right);
	mipretra(root->left);
}
int main()
{
	freopen("in.txt","r",stdin);
	cin>>n;Node* root=NULL;vector<int> initial;
	for(int i=0;i<n;i++){
		int temp;cin>>temp;initial.push_back(temp);
		build(root,temp);
	}
	pretra(root);
	mipretra(root);
	postra(root);
	mipostra(root);
	if(pre==initial){
		cout<<"YES"<<endl;
		for(int i=0;i<n;i++){
			if(i==0) cout<<pos[i];
			else cout<<' '<<pos[i];
		}
	}else if(mipre==initial){
		cout<<"YES"<<endl;
		for(int i=0;i<n;i++){
			if(i==0) cout<<mipos[i];
			else cout<<' '<<mipos[i];
		}
	}else{
		cout<<"NO"<<endl;
	}
	return 0;
}

后面这段代码可以AC,考察BST建树

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值