PAT-A 1043 Is It a Binary Search Tree (25 分)

二叉搜索树 (BST) 递归定义为具有以下属性的二叉树:

若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值
若它的右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值
它的左、右子树也分别为二叉搜索树
我们将二叉搜索树镜面翻转得到的树称为二叉搜索树的镜像。

现在,给定一个整数序列,请你判断它是否可能是某个二叉搜索树或其镜像进行前序遍历的结果。

输入格式
第一行包含整数 N,表示节点数量。

第二行包含 N 个整数。

输出格式
如果给定整数序列是某个二叉搜索树或其镜像的前序遍历序列,则在第一行输出 YES,否则输出 NO。

如果你的答案是 YES,则还需要在第二行输出这棵树的后序遍历序列。

数据范围
1≤N≤1000
输入样例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

模拟,建立两颗二叉搜索树,存好前序序列(二叉搜索树就是根据前序序列建的),比较,输出相应那一颗的后序遍历。

#include <bits/stdc++.h>

using namespace std;
struct node
{
    int data;
    struct node*l,*r;
};int num=0;
int n;
const int N = 1010;
int a[N];
vector<int> v[4];
struct node*create(int shu,struct node*tree)
{
    if(tree==NULL)
    {
        tree  = new node;
        tree->data = shu;
        tree->l=NULL;
        tree->r=NULL;
        return tree;
    }
    else if(shu<tree->data)
    {
        tree->l=create(shu,tree->l);
    }
    else
      tree->r= create(shu,tree->r);
     
    return tree;
}
struct node*create1(int shu,struct node*tree)
{
    if(tree==NULL)
    {
        tree  = new node;
        tree->data = shu;
        tree->l=NULL;
        tree->r=NULL;
        return tree;
    }
    else if(shu>=tree->data)
    {
        tree->l=create1(shu,tree->l);
    }
    else
      tree->r= create1(shu,tree->r);
     
    return tree;
}
void qianxv(struct node*root)
{
    if(root)
    {
     
        v[num].push_back(root->data);
        qianxv(root->l);
        qianxv(root->r);
    }
}
void houxv(struct node*root)
{
    if(root)
    {
        houxv(root->l);
        houxv(root->r);
        v[3].push_back(root->data);
        
    }
}
int main()
{
    cin >>n;
    struct node*p=NULL;
struct node*q=NULL;
    for(int i=1;i<=n;i++)
    {
        int shu;
        cin >> shu;
        v[2].push_back(shu);
        p=create(shu,p);
        q=create1(shu,q);
    }
    qianxv(p);
    num++;
    qianxv(q);
    for(int i=0;i<2;i++)
    {
        if(v[i]==v[2])
        {
            cout <<"YES"<<endl;
            if(i==0)
            houxv(p);
            else
            houxv(q);
            for(int i=0;i<v[3].size();i++)
            {
                cout <<v[3][i];
                if(i!=v[3].size()-1)
                cout <<" ";
            }
        return 0;
        }
    }
    cout <<"NO";
    
 
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值