PAT 1043【BST与二叉树】

考察:
1.二叉树的建树
2.前序遍历,后序遍历
3.BST的特性


这题的思路:
告诉你数组是先序遍历的,so 根已经知道了(数组首位元素),那么按照BST,建一下树(要两次,另外一次是镜像的);
跑一跑先序遍历,对一对是不是呀?
然后是的话就输出后序遍历的方式。

THAT'S ALL;

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

const int N=1e3+10;

struct BST{
	BST* Left;
	BST* Right;
	int w;
};

BST* Insert1(BST* p,int w)
{
	if(p==NULL)
	{
		p=(BST*)malloc(sizeof(BST));
		p->w=w;
		p->Left=NULL;
		p->Right=NULL;
		return p;
	}
	if(w>=p->w)
		p->Right=Insert1(p->Right,w);
	else
		p->Left=Insert1(p->Left,w);
	return p;
}

BST* Insert2(BST* p,int w)
{
	if(p==NULL)
	{
		p=(BST*)malloc(sizeof(BST));
		p->w=w;
		p->Left=NULL;
		p->Right=NULL;
		return p;
	}
	if(w<p->w)
		p->Right=Insert2(p->Right,w);
	else
		p->Left=Insert2(p->Left,w);
	return p;
}

vector<int>xs;
void Preorder(BST* p)
{
	if(p==NULL) return;
	xs.push_back(p->w);
	Preorder(p->Left);
	Preorder(p->Right);
}


void Postorder(BST* p)
{
	if(p==NULL) return;
	Postorder(p->Left);
	Postorder(p->Right);
	xs.push_back(p->w);
}

int main()
{
	int n;
	int a[N];
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	bool f1=true,f2=true;
	BST* root;
	root=(BST*)malloc(sizeof(BST));
	root->w=a[1];
	root->Left=NULL;
	root->Right=NULL;
	for(int i=2;i<=n;i++)
		Insert1(root,a[i]);
	xs.clear();
	Preorder(root);
	for(int i=0;i<n;i++)
		if(a[i+1]!=xs[i])
		{
			f1=false;
			break;
		}
	if(!f1)
	{
		root=(BST*)malloc(sizeof(BST));
		root->w=a[1];
		root->Left=NULL;
		root->Right=NULL;
		for(int i=2;i<=n;i++)
			Insert2(root,a[i]);
		xs.clear();
		Preorder(root);
		for(int i=0;i<n;i++)
			if(a[i+1]!=xs[i])
			{
				f2=false;
				break;
			}
	}
	if(!f1&&!f2)
	{
		puts("NO");
		return 0;
	}
	puts("YES");
	xs.clear();
	Postorder(root);
	for(int i=0;i<n;i++)
	{
		if(i) printf(" ");
		printf("%d",xs[i]);
	}
	return 0;
}






posted @ 2017-03-19 10:22  see_you_later  阅读(235)  评论(0编辑  收藏  举报