JD 1385:重建二叉树

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值