PAT

来源:互联网 发布:蛇舞 知乎 编辑:程序博客网 时间:2024/05/11 21:46

Problem : 这是二叉搜索树吗?

Description :

一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,

  • 其左子树中所有结点的键值小于该结点的键值;
  • 其右子树中所有结点的键值大于等于该结点的键值;
  • 其左右子树都是二叉搜索树。

所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。

给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。

Solution :

对于一个二叉搜索树的前序遍历序列来说,除开序列第一个元素,其余序列的部分被分成了小于根的连续部分和大于等于根的连续部分,因此判断的时候我们抓住这个特点写一个递归函数就好,最后在递归函数中后序输出这个序列。

Code (C++) :

#include <stdio.h>#include <string.h>#define MAX_LINE 1005int n, a[MAX_LINE], b[MAX_LINE], top;bool is_bin(int src, int des){    if (src > des)        return true;    int mid = des + 1;    for (int i = src + 1; i <= des; i++)        if (a[src] <= a[i]) {            mid = i;            break;        }    --mid;    int end = des + 1;    for (int i = mid + 1; i <= des; i++)        if (a[src] > a[i]) {            end = i;        }    if (end != des + 1)        return false;    if (is_bin(src + 1, mid) && is_bin(mid + 1, des)) {        b[top++] = a[src];        return true;    }    return false;}bool is_bin_rev(int src, int des){    if (src > des)        return true;    int mid = des + 1;    for (int i = src + 1; i <= des; i++)        if (a[src] > a[i]) {            mid = i;            break;        }    --mid;    int end = des + 1;    for (int i = mid + 1; i <= des; i++)        if (a[src] <= a[i]) {            end = i;        }    if (end != des + 1)        return false;    if (is_bin_rev(src + 1, mid) && is_bin_rev(mid + 1, des)) {        b[top++] = a[src];        return true;    }    return false;}void print(){    puts("YES");    for (int i = 0; i < top; i++)        printf("%d%c", b[i], i == top - 1 ? '\n' : ' ');}int main(){    //freopen("in", "r", stdin);    while (~scanf("%d", &n)) {        top = 0;        for (int i = 0; i < n; i++)            scanf("%d", &a[i]);        if (is_bin(0, n - 1))            print();        else if (top = 0, is_bin_rev(0, n - 1))            print();        else            puts("NO");    }    return 0;}
0 0
原创粉丝点击