1043 Is It a Binary Search Tree (25 分)
思路
构造二叉查找树需要不断插入,使用动态建树方法
而比较序列,vector比较存储的序列更方便
镜像二叉查找树 和 之前1102的二叉树的遍历类似,这次我们不需要重复构造,二叉树和二叉树的翻转的区别就是 原版的先序遍历为翻转版本的后序遍历的逆序,原版的后序遍历为翻转版本的先序遍历的逆序,原版的中序遍历为翻转版本的中序遍历的逆序。
层序遍历,就是每一层的逆序,掌握这个方法,也可以输出翻转版本的对应序列。
代码
#include<bits/stdc++.h>
using namespace std;
int N;
const int maxn = 1010;
struct node{
int data;
node* left;
node* right;
};
vector<int>origin,pre,preM,post,postM; //vector比较存储的序列更方便
void insert(node* &Node,int data) //插入二叉树
{
if(Node==NULL){
Node = new node;
Node->data = data;
Node->left = Node->right = NULL;
return;
}
if(data < Node->data)insert(Node->left,data);
else insert(Node->right,data);
}
void pre_order(node* Node)
{
if (Node==NULL)return;
pre.push_back(Node->data);
pre_order(Node->left);
pre_order(Node->right);
}
void post_order(node* Node)
{
if (Node==NULL)return;
post_order(Node->left);
post_order(Node->right);
post.push_back(Node->data);
}
int main()
{
int in;
cin>>N;
node* root = NULL;
for(int i =0;i<N;i++)
{
cin>>in;
origin.push_back(in);
insert(root,in);
}
pre_order(root);
post_order(root);
for(int i =pre.size()-1;i>=0;i--)
{
in = pre[i];
postM.push_back(in);
}
for(int i =post.size()-1;i>=0;i--)
{
in = post[i];
preM.push_back(in);
}
if (pre == origin)
{ cout<<"YES"<<endl;
for(int i =0;i<post.size()-1;i++)
cout<<post[i]<<" ";
cout<<post[post.size()-1]<<endl;
}
else if (preM == origin)
{ cout<<"YES"<<endl;
for(int i =0;i<postM.size()-1;i++)
cout<<postM[i]<<" ";
cout<<postM[postM.size()-1]<<endl;
}
else cout<<"NO"<<endl;
}