PAT Is It a Binary Search Tree (25)

题目简介:

  给出一棵树的序列,判断他是不是一棵BST,或者BST的镜像(BST左右子树交换)。是的话输出“YES”和这棵树的后续遍历序列,不是的话输出“NO”;

解题思路:

  二叉排序树的定义是递归定义的,所以很自然的想到使用递归来检测:

  1)在当前序列先确定根节点(第一个);

  2)然后在除第一个元素后的序列找到左右子树的分界线;

  3)按照分界线,对左右子树递归处理;

代码:

  1 #include<iostream>
  2 using namespace std;
  3 #define N 1010
  4 struct Node
  5 {
  6     static int count;
  7     int value;
  8     Node* left,*right;
  9     Node():left(NULL),right(NULL){}
 10 }ns[N];
 11 typedef Node* Tree;
 12 int Node::count=0;
 13 bool isBST(Tree& p,int begin,int end)//[begin,end)
 14 {
 15     if(end-begin<=0)
 16     {
 17         p=NULL;
 18         return true;
 19     }
 20     int mark=begin+1;
 21     while(mark<end&&ns[mark].value<ns[begin].value)
 22     {
 23         mark++;
 24     }
 25     int flag=mark;
 26     while(flag<end&&ns[flag].value>=ns[begin].value)
 27     {
 28         flag++;
 29     }
 30     if(flag!=end)
 31         return false;
 32     p=&ns[begin];
 33     return isBST(p->left,begin+1,mark)&&isBST(p->right,mark,end);
 34 }
 35 bool isMirro(Tree& p,int begin,int end)//[begin,end)
 36 {
 37     if(end-begin<=0)
 38     {
 39         p=NULL;
 40         return true;
 41     }
 42     int mark=begin+1;
 43     while(mark<end&&ns[mark].value>=ns[begin].value)
 44     {
 45         mark++;
 46     }
 47     int flag=mark;
 48     while(flag<end&&ns[flag].value<ns[begin].value)
 49     {
 50         flag++;
 51     }
 52     if(flag!=end)
 53         return false;
 54     p=&ns[begin];
 55     return isMirro(p->left,begin+1,mark)&&isMirro(p->right,mark,end);
 56 }
 57 bool first=true;
 58 void show(const Tree& p)
 59 {
 60     if(p->left!=NULL)
 61     {
 62         show(p->left);
 63     }
 64     if(p->right!=NULL)
 65     {
 66         show(p->right);
 67     }
 68     if(first)
 69     {
 70         first=false;
 71         printf("%d",p->value);
 72     }
 73     else
 74     {
 75         printf(" %d",p->value);
 76     }
 77 }
 78 int main()
 79 {
 80     //freopen("in.txt","r",stdin);
 81     //freopen("out.txt","w",stdout);
 82     int n;
 83     Tree head;
 84     scanf("%d",&n);
 85     int i;
 86     for(int i=0;i<n;i++)
 87         scanf("%d",&ns[i].value);
 88     if(isBST(head,0,n))
 89     {
 90         printf("YES\n");
 91         show(head);
 92     }else 
 93     {
 94         for(i=0;i<n;i++)
 95         {
 96             ns[i].left=ns[i].right=NULL;
 97         }
 98         if(isMirro(head,0,n))
 99         {
100             printf("YES\n");
101             show(head);
102         }
103         else
104         {
105             printf("NO\n");
106         }
107     }
108     return 0;
109 }

 

posted @ 2016-11-18 09:02  冠king  阅读(68)  评论(0)    收藏  举报