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