重建二叉树

输入前序遍历和中序遍历的序列,然后通过这两个序列构建出二叉树。
C语言代码如下:

typedef struct binary_tree_node{
        int value;
        struct binary_tree_node *left;
        struct binary_tree_node *right;
}bt_node;

bt_node * construct(int *preorder, int *inorder, int length)
{
        if (preorder == NULL || inorder == NULL || length <= 0){
                printf("[%s][%d] param is illegal\n",__FUNCTION__,__LINE__);
                return NULL;
        }

        return construct_core(preorder, preorder + length - 1,
                        inorder, inorder + length - 1);
}

bt_node *construct_core(int *start_preorder, int *end_preorder,
        int *start_inorder, int *end_inorder)
{
    // preorder first number is the value of root
    int root_value = start_preorder[0];
    int *root_inorder = NULL;
    int left_length = 0;
    int *left_preorder_end = NULL;

    bt_node *root = malloc(sizeof(bt_node));
    if (NULL == root){
        printf("[%s][%d] malloc memory failed.\n",__FUNCTION__,__LINE__);
        return NULL;
    }
    root->value = root_value;
    root->left = NULL;
    root->right = NULL;

    if (start_preorder == end_preorder){
        if (start_inorder == end_inorder)
            return root;
        else{
            printf("[%s][%d] invalid input!!!\n",__FUNCTION__,__LINE__);

        }
    }

    // find root valude in inorder list.
    root_inorder = start_inorder;
    while (root_inorder <= end_inorder && *root_inorder != root_value)
        ++root_inorder;

    if (root_inorder == end_inorder && *root_inorder != root_value)
        printf("[%s][%d] invalid input!!!\n",__FUNCTION__,__LINE__);

    left_length = root_inorder - start_inorder;
    left_preorder_end = start_preorder + left_length;
    if (left_length > 0){
        //construct left subtree
        root->left = construct_core(start_preorder+1, left_preorder_end,
                start_inorder, root_inorder - 1);
    }

    if (left_length < end_preorder - start_preorder){
        // construct right subtree
        root->right = construct_core(left_preorder_end + 1, end_preorder,
                root_inorder + 1, end_inorder);
    }

    return root;
}

参考: [1]剑指offer名企面试官精讲典型编程题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值