7-28 搜索树判断

7-28 搜索树判断(25 分)

对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。

现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。

输入格式:

输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,数字间以空格分隔。

输出格式:

输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,则输出YES,否侧输出NO。如果判断结果是YES,下一行输出对应二叉树的后序遍历序列。数字间以空格分隔,但行尾不能有多余的空格。

输入样例1:

7
8 6 5 7 10 8 11

输出样例1:

YES
5 7 6 8 11 10 8

输入样例2:

7
8 6 8 5 10 9 11

输出样例2:

NO

思路:判断是否为先序队列,我想的是每个数的后面的数可以分为两段,一段是大于该数,另一段是小于该数,用异或实现该判断,循环判断到倒数第三个数,然后进行建树,然后后序遍历输出。不是这么简单嘛?等等为什么这次测试点只有1234阿拉伯数字了!明天还有课就不熬夜调试了
参考了下别人家答案,然后我能说洗个脚就找到了

感觉题目也是表述有问题吧->如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,输出对应二叉树的后序遍历序列,这个对应是对应二叉搜索树呢还是镜像的二叉搜索树?可能我语文不好🤒
所以下面第一个是对的,第二个是错的:
输入样例:
7
8 10 11 8 6 7 5
输出样例:
YES 11 8 10 7 5 6 8
输入样例:
7
8 10 11 8 6 7 5
输出样例:
YES
5 7 6 8 11 10 8

 

AC代码如下:

#include<stdio.h>
#include<iostream>
using namespace std;
typedef struct Node{
    int num;
    struct Node* left;
    struct Node* right;
}Node, *Nodep;
int n;
int sign = 0;
void creat(Nodep &p, int num)
{
    if (!p){
        p = new Node;
        p->num = num;
        p->left = NULL;
        p->right = NULL;
        return;
    }
    if (p->num <= num)
        creat(p->right, num);
    else creat(p->left, num);
}
bool check(int *a)
{
    int sum = 0;
    for (int i = 0; i < n - 1; i++)
    {
        int flag = a[0] > a[1] ? 0 : 1;
        int flagg = 0;                        //用来排除只有左子树或右子树的情况
        for (int j = i + 1; j<n; j++)
        {
            int cnt = a[i]>a[j] ? 0 : 1;
            if (cnt^flag)
            {
                flag = cnt;
                flagg++;
            }
        }
        if (flagg < 2)            //如果该数后面的有一次异或OR没有异或
            sum++;
    }
    return sum == n - 1 ? true : false;        //如果前N-1个数都符合条件,则该序列正确
}
void Print(Nodep p,int bug)        //百度后才找到的BUG
{
    if (!p)return;
    if (bug == 0){
        if (p->left)    Print(p->left, bug);
        if (p->right)Print(p->right, bug);
    }
    else {
        if (p->right)Print(p->right, bug);
        if (p->left)    Print(p->left, bug);
    }
    

    if (sign == 0)sign = 1;
    else cout << " ";
    cout << p->num;
}
int main()
{
    int a[1005]; cin >> n;

    for (int i = 0; i < n; i++)
        cin >> a[i];

    if (n == 1){
        cout << "YES\n" << a[0] << endl;
        return 0;
    }

    Nodep tree = NULL;
    if (check(a)){                                //如果该序列正确
        cout << "YES" << endl;
        for (int i = 0; i < n; i++)
            creat(tree, a[i]);                //创建排序二叉树
        if (a[0]>a[1])
        Print(tree,0);                        //后序输出二叉搜索树
        else Print(tree, 1);
        cout << endl;
    }
    else cout << "NO" << endl;


    return 0;
}

 

 


 

 
posted @ 2018-03-01 00:00  我只有一件白T恤  阅读(407)  评论(0编辑  收藏  举报