标签:btree ace ecif 遍历 case with contain push nod
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:
If we swap the left and right subtrees of every node, then the resulting tree is called the Mirror Image of a BST.
Now given a sequence of integer keys, you are supposed to tell if it is the preorder traversal sequence of a BST or the mirror image of a BST.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (<=1000). Then N integer keys are given in the next line. All the numbers in a line are separated by a space.
Output Specification:
For each test case, first print in a line "YES" if the sequence is the preorder traversal sequence of a BST or the mirror image of a BST, or "NO" if not. Then if the answer is "YES", print in the next line the postorder traversal sequence of that tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.
Sample Input 1:
7 8 6 5 7 10 8 11
Sample Output 1:
YES 5 7 6 8 11 10 8
Sample Input 2:
7 8 10 11 8 6 7 5
Sample Output 2:
YES 11 8 10 7 5 6 8
Sample Input 3:
7 8 6 8 5 10 9 11
Sample Output 3:
NO
解题思路:判断一颗树的前序遍历是否是搜索二叉树或者是其镜像,镜像的意思是:左子树都大于等于根,右子树小于根。做法是建树,判断是否是搜索二叉树,如果不是就判断是否是镜像。
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<cstdlib> using namespace std; struct Tree{ int val; Tree* left; Tree* right; }; vector<int>value; bool ind=true; bool l_num(int a,int b){ return a<b; } bool r_num(int a,int b){ return a>=b; } Tree* bulid(int left,int right,bool cmp(int a,int b)){ if(!ind)return NULL;//标志已经不能建成树了 if(left>right)return NULL; Tree* root = new Tree(); root->val=value[left]; if(left==right)return root; int i; for(i=left+1;i<=right;i++){ if(!cmp(value[i],root->val)){ break; } } root->left=bulid(left+1,i-1,cmp); int j; for(j=i;j<=right;j++){ if(cmp(value[j],root->val)){ ind=false; return NULL; } } root->right=bulid(i,right,cmp); return root; } int n; bool tag=true; void postorder(Tree* root){ if(root){ postorder(root->left); postorder(root->right); if(tag){ printf("%d",root->val); tag=false; }else { printf(" %d",root->val); } } } int main(){ scanf("%d",&n); int i,j; int flag; int v; for(i=0;i<n;i++){ scanf("%d",&v); value.push_back(v); } if(n==1){ printf("YES\n%d\n",value[0]); return 0; } Tree* root = bulid(0,n-1,l_num); if(ind){ printf("YES\n"); postorder(root); }else{ ind=true; root = bulid(0,n-1,r_num); if(ind){ printf("YES\n"); postorder(root); }else{ printf("NO\n"); } } }
1043. Is It a Binary Search Tree (25)
标签:btree ace ecif 遍历 case with contain push nod
原文地址:http://www.cnblogs.com/grglym/p/7765356.html