4-06. 搜索树判断(25) (ZJU_PAT)

题目链接:http://www.patest.cn/contests/ds/4-06

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

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

输入格式说明:

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

输出格式说明:

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

样例输入与输出:

序号 输入 输出
1
7
8 6 5 7 10 8 11
YES
5 7 6 8 11 10 8
2
7
8 10 11 8 6 7 5
YES
11 8 10 7 5 6 8
3
7
8 6 8 5 10 9 11
NO
4
16
100 70 60 62 68 65 69 200 150 140 160 155 300 400 500 450
YES
65 69 68 62 60 70 140 155 160 150 450 500 400 300 200 100
5
17
85 92 100 120 110 105 88 90 50 20 30 40 35 36 32 28 15
YES
105 110 120 100 90 88 92 36 32 35 40 28 30 15 20 50 85
6
7
8 6 7 5 10 11 9
NO
7
1
-1
YES
-1

代码如下:

#include <cstdio>
#include <malloc.h>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <algorithm>
#include <iostream>
using namespace std;

#define LEN sizeof(Node)
const int maxn = 1017;
typedef struct Node
{
    int num;
    struct Node *right, *left;
} Node;

queue<int >Q1;
queue<int >Q2;

void swap(Node *&T)//交换每个节点的左右子树
{
    Node *tt = NULL;
    if(!T)
        return ;
    swap(T->left);
    swap(T->right);
    tt = T->left;
    T->left = T->right;
    T->right = tt;
}

void insert(Node * &T, int data)//建立二叉树
{
    if(!T)
    {
        T = (Node*)malloc(LEN);
        T->num = data;
        T->left = T->right = NULL;
        return ;
    }
    else
    {
        if(data >= T->num)
        {
            insert(T->right, data);
        }
        else
        {
            insert(T->left, data);
        }
    }
}

void Pre_order(Node * &T)//先序遍历
{
    if(!T)
        return ;
    Q1.push(T->num);
    Pre_order(T->left);
    Pre_order(T->right);
}

void Later_order(Node * &T)//后续遍历
{
    if(!T)
        return ;
    Later_order(T->left);
    Later_order(T->right);
    Q2.push(T->num);
}

int main()
{
    int n;
    int a[maxn];
    int flag = 0;
    Node *root = NULL;
    scanf("%d",&n);
    for(int i = 0; i < n; i++)
    {
        scanf("%d",&a[i]);
        insert(root, a[i]);
    }
    Pre_order(root);//先序遍历
    for(int i = 0; i < n; i++)
    {
        int tt = Q1.front();
        if(a[i] != tt)//不是二叉搜索数的先序遍历
        {
            flag++;
            while(!Q1.empty())
            {
                Q1.pop();
            }
            break;
        }
        Q1.pop();
    }
    if(flag)
    {
        swap(root);//交换根值,变为镜像二叉搜索树
        Pre_order(root);//再次先序遍历
        for(int i = 0; i < n; i++)
        {
            int tt = Q1.front();
            if(a[i] != tt)//也不是镜像二叉树的先序遍历
            {
                flag++;
                while(!Q1.empty())
                {
                    Q1.pop();
                }
                break;
            }
            Q1.pop();
        }
    }
    if(flag == 2)//不是先序遍历
    {
        printf("NO\n");
    }
    else
    {
        printf("YES\n");
        Later_order(root);//后续遍历
        for(int i = 0; i < n-1; i++)
        {
            int tt = Q2.front();
            printf("%d ",tt);
            Q2.pop();
        }
        printf("%d\n",Q2.front());
    }
    return 0;
}
时间: 2024-10-20 07:29:36

4-06. 搜索树判断(25) (ZJU_PAT)的相关文章

华为机试题 二叉查搜索树 判断两序列是否为同一二叉搜索树序列

描述: 判断两序列是否为同一二叉搜索树序列 输入 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树. 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树. 输出: 如果序列相同则输出YES,否则输出NO 样例输入: 2 567432 543267 576342 0 样例输出: YES NO 本题思路:根

04-树4 是否同一棵二叉搜索树(25 分)

给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果.于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树. 输入格式: 输入包含若干组测试数据.每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数.第2行给出N个以空格分隔的正整数,作为初始插入序列.最后L行,每行给出N个插入的元素,属于

7-4 是否同一棵二叉搜索树(25 分)

给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果.于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树. 输入格式: 输入包含若干组测试数据.每组数据的第1行给出两个正整数N (≤)和L,分别是每个序列插入元素的个数和需要检查的序列个数.第2行给出N个以空格分隔的正整数,作为初始插入序列.最后L行,每行给出N个插入的元素,属于L个

PTA 7-28 搜索树判断(镜像二叉搜索树的后序遍历)

算法源代码在 Veeupup Github 考点: 二叉搜索树遍历方式和性质运用 对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值.如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树. 现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列. 输入格式: 输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,

06 实现判断小数点输入位置的四则运算器

1 private void txtNumber1_KeyPress(object sender, KeyPressEventArgs e) 2 { 3 //MessageBox.Show(((int)(e.KeyChar)).ToString()); //ASCii查看 4 //由于本事件可能有多个文本框的触发,所以要通过sender来得到触发该事件的控件 5 TextBox currentTextBox = sender as TextBox; 6 7 if (e.KeyChar < '0'

XCode4.5.6,iOS6.1下测试 判断当前设备,及其联网状态等; 关于设备插上后XCode检测不出的情况的说明

目录[-] 一.判断设备 二.判断网络连接状态 三.设备不显示的解决办法 一.判断设备 01 //设备名称 02 return [UIDevice currentDevice].name; 03   04 //设备型号,只可得到是何设备,无法得到是第几代设备 05 return [UIDevice currentDevice].model; 06   07 //系统版本型号,如iPhone OS 08 return [UIDevice currentDevice].systemVersion;

7-4 是否同一棵二叉搜索树

7-4 是否同一棵二叉搜索树(25 分) 给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果.于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树. 输入格式: 输入包含若干组测试数据.每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数.第2行给出N个以空格分隔的正整数,作为初始插入序

是否同一棵二叉搜索树

04-树4 是否同一棵二叉搜索树 (25 分) 给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果.于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树. 输入格式: 输入包含若干组测试数据.每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数.第2行给出N个以空格分隔的正整数,作为初始

ios-密码判断

我们经常在项目时有涉及到用户或是手机号登录,这时一般会配合密码才能登录成功. 下面发一些关于手机和密码形式的判断: 1 - (void)registButtonClick:(id)sender 2 { 3 if (self.phoneTextField.text.length != 11 )//手机号码判断 4 { 5 if (self.phoneTextField.text.length <= 0) 6 { 7 pushView.hidden = NO; 8 pushView.tiShiLab