疑问
暂无
代码
//二分查找树
//需要注意的是,二分查找树的先序遍历序列,应该能重新构建这棵二分查找树
#include<cstdio>
struct node{
int data;
node* lchild;
node* rchild;
};
const int maxn = 1010;
int input[maxn];
//前序数组
int pre[maxn];
int m=0;
//后序数组
int post[maxn];
int p=0;
node* newNode(int v){
node* root = new node;
root->data = v;
root->lchild = NULL;
root->rchild = NULL;
return root;
}
void insert(node* &root,int x){
if(root == NULL){
root = newNode(x);
}else if(x < root->data){
insert(root->lchild,x);
}else if(x >= root->data){
insert(root->rchild,x);
}
}
node* create(int data[],int n){
node* root = NULL;
for(int i=0;i<n;i++){
insert(root,data[i]);
}
return root;
}
void preOrder(node* root){
if(root == NULL){
return;
}else{
pre[m++] = root->data;
preOrder(root->lchild);
preOrder(root->rchild);
}
}
void postOrder(node* root){
if(root == NULL){
return;
}else{
postOrder(root->lchild);
postOrder(root->rchild);
post[p++] = root->data;
}
}
int main(){
int n;
scanf("%d",&n);
//用于记录是否满足
bool flag = true;
for(int i=0;i<n;i++){
scanf("%d",&input[i]);
}
//根据输入的序列建立一棵二叉查找树
node* root = NULL;
root = create(input,n);
//通过先序遍历或者后序遍历得到的二叉查找树来检查是否符合条件
preOrder(root);
for(int i=0;i<n;i++){
if(pre[i] != input[i]){
flag = false;
break;
}
}
if(flag == true){
printf("YES\n");
postOrder(root);
for(int i=0;i<n;i++){
printf("%d%c",post[i],i!=n-1?' ':NULL);
}
return 0;
}else{
flag = true;
postOrder(root);
for(int i=0;i<n;i++){
if(post[n-i-1] != input[i]){
flag = false;
break;
}
}
if(flag == true){
printf("YES\n");
//直接使用之前的inOrder进行输出
for(int i=0;i<n;i++){
printf("%d%c",pre[n-i-1],i!=n-1?' ':NULL);
}
return 0;
}
}
printf("NO");
return 0;
}
反思
- 这道题我第一次写的时候,连怎么动手都不会,完全不知道对于一棵BST而言,它的前序遍历序列是可以重构它的这一特点,后来看了《算法笔记》上的解答才恍然大悟,我还菜。。。
- 至于mirror image of BST,只需要注意它与BST之间的对应就好啦,自己举几个小例子就明白了。
来源:CSDN
作者:yc_cy1999
链接:https://blog.csdn.net/yc_cy1999/article/details/104519996