A1043
#include<bits/stdc++.h>
using namespace std;
struct node{
int data;
node *left,*right;
};
int N,a[1000];
int used;
vector<int> post;
node* makeBST(int cur,int ceil,int floor)//上限,下限
{
node* p=new node;
used++;
p->data=a[cur];
int i;
for(i=cur+1;i<N&&a[i]>=floor&&a[i]<a[cur];i++);//遍历左子树
if(i==cur+1) p->left=NULL;
else p->left=makeBST(cur+1,a[cur],floor);
if(i<N&&a[i]>=a[cur]&&a[i]<ceil) p->right=makeBST(i,ceil,a[cur]);
else p->right=NULL;
return p;
}
node* makeMBST(int cur,int ceil,int floor)//上限,下限
{
node* p=new node;
used++;
p->data=a[cur];
int i;
for(i=cur+1;i<N&&a[i]<ceil&&a[i]>=a[cur];i++);//遍历左子树
if(i==cur+1) p->left=NULL;
else p->left=makeMBST(cur+1,ceil,a[cur]);
if(i<N&&a[i]<a[cur]&&a[i]>=floor) p->right=makeMBST(i,a[cur],floor);
else p->right=NULL;
return p;
}
void postorder(node*root)
{
if(!root) return ;
postorder(root->left);
postorder(root->right);
post.push_back(root->data);
}
int main()
{
int i,j,k;
cin>>N;
for(i=0;i<N;i++) cin>>a[i];
used=0;
node*root=makeBST(0,100000000,-100000000);
if(used==N){
cout<<"YES\n";
postorder(root);
for(i=0;i<post.size();i++){
if(i) cout<<" ";
cout<<post[i];
}
}
else{
used=0;
root=makeMBST(0,100000000,-10000000);
if(used==N){
cout<<"YES\n";
postorder(root);
for(i=0;i<post.size();i++){
if(i) cout<<" ";
cout<<post[i];
}}
else{
cout<<"NO";
return 0;
}
}
return 0;
}
A1064
不想写了呜呜呜
#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
int n,number[maxn],CBT[maxn],indexer=0;
void inorder(int root){
if(root>n) return ;
inorder(root*2);
CBT[root]=number[indexer++];
inorder(root*2+1);
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&number[i]);
}
sort(number,number+n);
inorder(1);
for(int i=1;i<=n;i++)
{
printf("%d",CBT[i]);
if(i<n) printf(" ");
}
return 0;
}
A1099
//对于一颗二叉查找树来说,中序遍历序列是递增的
//因此只需要把给定的整数序列从小到大排序,然后对给定的二叉树进行中序遍历
//将排序后序列 的整数按中序遍历的整数按中序遍历的顺序填入二叉树就可以形成二叉查找树
#include<bits/stdc++.h>
using namespace std;
int N;
const int maxn=101;
struct node{
int data;
int lchild,rchild;
}Node[maxn];
int in[maxn],num=0;
void inorder(int root)//中序遍历二叉树
{
if(root==-1) return;
inorder(Node[root].lchild);
Node[root].data=in[num++];//中序遍历存在Node结构体里
inorder(Node[root].rchild);//中序遍历,从左到右,从小到大
}
void bfs(int root){//层序遍历
queue<int> q;
q.push(root);
num=0;
while(!q.empty())
{
int now=q.front();
q.pop();
printf("%d",Node[now].data);
num++;
if(num<N) printf(" ");
if(Node[now].lchild!=-1) q.push(Node[now].lchild);
if(Node[now].rchild!=-1) q.push(Node[now].rchild);
}
}
int main()
{
cin>>N;
for(int i=0;i<N;i++){
scanf("%d%d",&Node[i].lchild,&Node[i].rchild);
}
for(int i=0;i<N;i++)
{
scanf("%d",in[i]);//中序序列
}
sort(in,in+N);//从小到大排序
inorder(0);//中序遍历排序
bfs(0);
return 0;
}
A1066
重做
#include<bits/stdc++.h>
using namespace std;
struct node{
int v,height;
node *lchild,*rchild;
}*root;
//生成一个新结点
node* newNode(int v){
node* Node=new node;
Node->v=v;
Node->height=1;
Node->lchild=Node->rchild=NULL;
return Node;
}
int getheight(node* root){
if(root==NULL) return 0;
return root->height;
}
void updateheight(node* root){
root->height=max(getheight(root->lchild),getheight(root->rchild))+1;
}
int getbalancefactor(node* root){
return getheight(root->lchild)-getheight(root->rchild);
}
//左旋
void L(node* &root){
node* temp=root->rchild;
root->rchild=temp->lchild;
temp->lchild=root;
updateheight(root);
updateheight(temp);
root=temp;
}
//右旋
void R(node* &root){
node* temp=root->lchild;
root->lchild=temp->rchild;
temp->rchild=root;
updateheight(root);
updateheight(temp);
root=temp;
}
//插入权值为v的结点
void insert(node* &root,int v){
if(root==NULL){
root=newNode(v);
return ;
}
if(v<root->v){
insert(root->lchild,v);
updateheight(root);
if(getbalancefactor(root)==2){
if(getbalancefactor(root->lchild)==1){
R(root);
}else if(getbalancefactor(root->lchild)==-1)
{
L(root->lchild);
R(root);
}
}
}
else{
insert(root->rchild,v);
updateheight(root);
if(getbalancefactor(root)==-2){
if(getbalancefactor(root->rchild)==-1){
L(root);
}else if(getbalancefactor(root->rchild)==1)
{
R(root->rchild);
L(root);
}
}
}}
node* create(int data[],int n){
node* root=NULL;
for(int i=0;i<n;i++)
{
insert(root,data[i]);
}
return root;
}
int main()
{
int n,v;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&v);
insert(root,v);
}
printf("%d\n",root->v);
return 0;
}