博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~
http://www.cnblogs.com/chenxiwenruo/p/6789220.html
特别不喜欢那些随便转载别人的原创文章又不给出链接的
所以不准偷偷复制博主的博客噢~~
题意:给出一个序列,问你是否是一棵二叉搜索树或者是其镜像的前序遍历。
并且输出其后序遍历。
一开始没考虑到只有一个子树...比如
BST
7
8 11 9 8 10 13 12
MIRROR
7
8 11 13 12 9 10 8
所以要先判断是否为BST,不是的话再判断是否为mirror BST
都不是输出NO
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <string.h> #define LEFT 1 #define RIGHT 2 using namespace std; const int maxn=1005; int n; int seq[maxn]; int cnt=0; struct Node{ int left=-1; int right=-1; int val; }node[maxn]; /** 判断对应区间[l,r]是否为二叉搜索树 fa为其父亲节点 leftOrRight表示该子树为父亲节点的左孩子还是右孩子 */ bool solveBST(int l,int r,int fa,int leftOrRight){ //printf("l:%d r:%d fa:%d leftorRight:%d ",l,r,fa,leftOrRight); if(l>r) return true; if(l==r){ node[cnt].val=seq[l]; if(leftOrRight==LEFT){ node[fa].left=cnt; } else{ node[fa].right=cnt; } cnt++; return true; } node[cnt].val=seq[l]; int val=seq[l]; int id=cnt; if(fa!=-1){ if(leftOrRight==LEFT){ node[fa].left=cnt; } else{ node[fa].right=cnt; } } cnt++; int i; for(i=l+1;i<=r;i++){ if(seq[i]>=val){ break; } } for(int j=i+1;j<=r;j++){ //如果右子树应该都>=val,如果有小于的,那么就不是BST //printf("seq[j]:%d val:%d ",seq[j],val); if(seq[j]<val){ return false; } } if(!solveBST(l+1,i-1,id,LEFT)) return false; if(!solveBST(i,r,id,RIGHT)) return false; return true; } /** 判断对应区间[l,r]是否为二叉搜索树的镜像 fa为其父亲节点 leftOrRight表示该子树为父亲节点的左孩子还是右孩子 */ bool solveMirrorBST(int l,int r,int fa,int leftOrRight){ //printf("l:%d r:%d fa:%d leftorRight:%d ",l,r,fa,leftOrRight); if(l>r) return true; if(l==r){ node[cnt].val=seq[l]; if(leftOrRight==LEFT){ node[fa].left=cnt; } else{ node[fa].right=cnt; } cnt++; return true; } node[cnt].val=seq[l]; int val=seq[l]; int id=cnt; if(fa!=-1){ if(leftOrRight==LEFT){ node[fa].left=cnt; } else{ node[fa].right=cnt; } } cnt++; int i; for(i=l+1;i<=r;i++){ if(seq[i]<val){ break; } } for(int j=i+1;j<=r;j++){ //mirror的右子树应该都是<val,如果不是,则不是mirror BST if(seq[j]>=val){ return false; } } if(!solveMirrorBST(l+1,i-1,id,LEFT)) return false; if(!solveMirrorBST(i,r,id,RIGHT)) return false; return true; } bool first=true; void postOrder(int u){ if(u==-1) return; postOrder(node[u].left); postOrder(node[u].right); if(first){ printf("%d",node[u].val); first=false; } else printf(" %d",node[u].val); } void init(){ cnt=0; for(int i=0;i<maxn;i++){ node[i].left=node[i].right=-1; } } int main() { scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&seq[i]); } if(solveBST(0,n-1,-1,-1)){ printf("YES "); postOrder(0); } else{ init(); if(solveMirrorBST(0,n-1,-1,-1)){ printf("YES "); postOrder(0); } else{ printf("NO "); } } return 0; }