重建二叉树

来源:互联网 发布:农村淘宝县级运营中心 编辑:程序博客网 时间:2024/05/22 03:20

输入前序遍历和中序遍历的序列,然后通过这两个序列构建出二叉树。
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名企面试官精讲典型编程题