【数据结构】进击的二叉查找树

Description

给定1~N的两个排列,使用这两个排列分别构建两棵二叉查找树(也就是通过往一棵空树中依次插入序列元素的构建方式)。如果这两棵二叉查找树完全相同,那么输出YES;否则输出NO。之后,输出第一个排列对应的二叉查找树的后序序列、层序序列。

Input

每个输入文件中一组数据。

第一行1个正整数N(1<=N<=30),表示二叉查找树中的结点个数。

接下来两行,代表1~N的两个排列。

Output

如果两个排列代表的二叉查找树完全相同,那么输出一行YES,否则输出一行NO。

接下来两行分别输出第一个排列对应的二叉查找树的后序序列、层序序列,整数之间用空格隔开。

每行末尾不允许有多余的空格。

Sample Input

5
4 2 1 3 5
4 5 2 3 1

Sample Output

YES
1 3 2 5 4
4 2 5 1 3
/**************************************************************
    Problem: 2943
    User: 201717010009
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:1720 kb
****************************************************************/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<malloc.h>
#include<bits/stdc++.h>
using namespace std;
int n,num,a[100],b[100],i;
int Q1[100],Z1[100],Q2[100],Z2[100];
typedef struct BSTNode{
    int data;
    struct BSTNode *lchild;
    struct BSTNode *rchild;
}BSTNode,*PBSTNode;
PBSTNode insert(int data,PBSTNode *root){
    if(*root == NULL)
    {
        *root=(PBSTNode)malloc(sizeof(BSTNode));
        (*root)->data=data;
        (*root)->lchild=NULL;
        (*root)->rchild=NULL;
        return *root;
     }
     if(data<(*root)->data)
        (*root)->lchild=insert(data,&( (*root)->lchild) );
     else if(data>(*root)->data)
        (*root)->rchild=insert(data,&( (*root)->rchild) );
     return *root;
}
void QX1(PBSTNode root){//得到第一序列的前序序列 
    if(root!=NULL)
    {
        Q1[i++]=root->data;
        QX1(root->lchild);
        QX1(root->rchild);
    }
} 
void ZX1(PBSTNode root){//得到第一序列的中序序列 
    if(root!=NULL)
    {
        ZX1(root->lchild);
        Z1[i++]=root->data;
        ZX1(root->rchild);
    }
} 
void QX2(PBSTNode root){//得到第二序列的前序序列 
    if(root!=NULL)
    {
        Q2[i++]=root->data;
        QX2(root->lchild);
        QX2(root->rchild);
    }
} 
void ZX2(PBSTNode root){//得到第二序列的中序顺序 
    if(root!=NULL)
    {
        ZX2(root->lchild);
        Z2[i++]=root->data;
        ZX2(root->rchild);
    }
} 
void HX(PBSTNode root){
    if(root!=NULL)
    {
        HX(root->lchild);
        HX(root->rchild);
        printf("%d",root->data);
        if(num<n-1){
            cout<<" ";num++;
        }
    }
} 
void CX(PBSTNode root){
    PBSTNode q[100];
    int w=1,t=1;//建队
    if(root==NULL){
        return ;
    }
    q[w++]=root;
    while(t!=w){
        if(q[t]->lchild!=NULL){
            q[w++]=q[t]->lchild;
        }
        if(q[t]->rchild!=NULL){
            q[w++]=q[t]->rchild;
        }
        cout<<q[t]->data;
        if(num<n-1){
            cout<<" ";num++;
        }
        t++;
    }
} 
int main(){
    PBSTNode root1=NULL,root2=NULL;
    cin>>n;
    for(i=0;i<n;i++){
        cin>>a[i];
        insert(a[i],&root1);
    }
    for(i=0;i<n;i++){
        cin>>b[i];
        insert(b[i],&root2);
    }
    i=0;QX1(root1);
    i=0;ZX1(root1);
    i=0;QX2(root2);
    i=0;ZX2(root2);
    int flag=0;
    for(i=0;i<n;i++){//比较前序序列 
        if(Q1[i]!=Q2[i]){
            cout<<"NO"<<endl;
            flag=1;break;
        }
    }
    for(i=0;i<n;i++){//比较后序序列 
        if(flag==1)break;
        if(Z1[i]!=Z2[i]){
            cout<<"NO"<<endl;
            flag=1;break;
        }
    }
    if(!flag){
        cout<<"YES"<<endl;
    }
    num=0;
    HX(root1);
    cout<<endl;
    num=0;
    CX(root1);
}
  

猜你喜欢

转载自blog.csdn.net/holly_Z_P_F/article/details/85161364