JD 1385:重建二叉树

来源:互联网 发布:ps淘宝美工修图视频 编辑:程序博客网 时间:2024/05/16 14:24

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;}


0 0
原创粉丝点击