OJ题目:click here~~
题目分析:给前序遍历序列和中序遍历序列,重构二叉树并输出后序遍历序列
剑指offer 面试题6
AC_CODE
int pre[1008] , in[1008] ;
struct Node{
int x ;
Node *left ;
Node *right ;
};
bool buildsubtree(Node*& root , int* spre , int* epre , int* sin ,int* ein){
int rootV = spre[0] ;
Node* p = (Node *)malloc(sizeof(Node)) ;
p->x = rootV ;
p->right = p->left = NULL ;
root = p ;
if(spre == epre){
if(sin == ein && *spre == *ein)
return true ;
else return false ;
}
int *rootin = sin ;
while(rootin < ein && *rootin != rootV) rootin++ ;
if(rootin == ein && *rootin != rootV) return false ;
int llen = rootin - sin ;
bool ret = true ;
if(llen > 0)
ret = ret && buildsubtree(root->left , spre+1 , spre+llen , sin , rootin-1) ;
if(ein - sin - llen > 0)
ret = ret && buildsubtree(root->right , spre+llen+1,epre,rootin+1,ein ) ;
return ret ;
}
bool buildtree(Node*& root , int* pre , int* in , int len){
return buildsubtree(root , pre , pre + len - 1, in , in + len - 1) ;
}
void PostVisit(Node* root){
if(root != NULL){
PostVisit(root->left) ;
PostVisit(root->right) ;
printf("%d ",root->x) ;
}
}
void Clear(Node* root){
if(root != NULL){
Node* p = root->left ;
Node* q = root->right ;
free(root) ;
Clear(p) ;
Clear(q) ;
}
}
int main()
{
int n ;
while(cin >> n){
for(int i = 0;i < n;i++) scanf("%d",&pre[i]) ;
for(int i = 0;i < n;i++) scanf("%d",&in[i]) ;
Node *root = NULL ;
if(buildtree(root , pre , in , n)){
PostVisit(root) ;
puts("") ;
}
else{
puts("No") ;
}
Clear(root) ;
}
return 0;
}