L2-004. 这是二叉搜索树吗?
一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,
其左子树中所有结点的键值小于该结点的键值;
其右子树中所有结点的键值大于等于该结点的键值;
其左右子树都是二叉搜索树。
所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。
给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。
输入格式:
输入的第一行给出正整数N(<=1000)。随后一行给出N个整数键值,其间以空格分隔。
输出格式:
如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果,则首先在一行中输出“YES”,然后在下一行输出该树后序遍历的结果。数字间有1个空格,一行的首尾不得有多余空格。若答案是否,则输出“NO”。
输入样例1:
7
8 6 5 7 10 8 11
输出样例1:
YES
5 7 6 8 11 10 8
输入样例2:
7
8 10 11 8 6 7 5
输出样例2:
YES
11 8 10 7 5 6 8
输入样例3:
7
8 6 8 5 10 9 11
输出样例3:
NO
解题思路:
使用晴神书上的解题方法,很好理解。
1.根据输入顺序,构建二叉搜索树。
2.用前序、镜像前序、后序、镜像后序,来分别遍历这棵BST,得到遍历序列。借用vector数组的性质,可以比较整个数组。
3.比较遍历得到的数组,按照题目要求的逻辑来判断并输出。
#include<cstdio>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=1e3+10;
struct node{
int data;
node *lchild,*rchild;
};
void insert(node* &root,int x){
if(root==NULL){
root=new node;
root->data =x;
root->lchild =root->rchild =NULL;
return ;
}else if(x <root->data ){
insert(root->lchild ,x);
}else{
insert(root->rchild ,x);
}
}
vector<int>ori,pre,mpre,post,mpost;
//先序
void preorder(node *root,vector<int>&vi){
if(root==NULL) return;
vi.push_back(root->data );
preorder(root->lchild,vi );
preorder(root->rchild ,vi);
}
//镜像先序
void mpreorder(node *root,vector<int>&vi){
if(root==NULL) return;
vi.push_back(root->data );
mpreorder(root->rchild,vi );
mpreorder(root->lchild ,vi);
}
//后序
void postorder(node *root,vector<int>&vi) {
if(root==NULL) return ;
postorder(root->lchild ,vi);
postorder(root->rchild ,vi);
vi.push_back(root->data );
}
//镜像后序
void mpostorder(node *root,vector<int>&vi) {
if(root==NULL) return ;
mpostorder(root->rchild ,vi);
mpostorder(root->lchild ,vi);
vi.push_back(root->data );
}
int main(){
int n,x;
node *root=NULL;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&x);
ori.push_back(x) ;
insert(root,x);
}
preorder(root,pre);
mpreorder(root,mpre);
postorder(root,post);
mpostorder(root,mpost);
if(ori==pre){
printf("YES\n");
for(int i=0;i<post.size() ;i++){
printf("%d",post[i]);
if(i<post.size() -1) printf(" ");
else printf("\n");
}
}else if(ori==mpre){
printf("YES\n");
for(int i=0;i<mpost.size() ;i++){
printf("%d",mpost[i]);
if(i<mpost.size() -1) printf(" ");
else printf("\n");
}
}else{
printf("NO\n");
}
return 0;
}