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 }

浙公网安备 33010602011771号