根据先序和中序构建二叉树
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
typedef struct struct_tree * Tree;
struct struct_tree
{
Tree left;
Tree right;
int element;
};
static Tree constructtree(int *head_arr, int *end_head, int *mid_arr, int *end_mid)
{
Tree tree = (Tree)malloc(sizeof(*tree));
if(tree==NULL){
printf("there is no space\n");
return 0;
}
int element = head_arr[0];
tree->element = element;
tree->right = NULL;
tree->left = NULL;
printf("element is %d\n", element);
if(head_arr==end_head&&mid_arr==end_mid&&*head_arr==*mid_arr){
return tree;
}
//在中序中找到root节点
int *rootorder = mid_arr;
while(rootorder<=end_mid){
//printf("rootorder is %d\n", *rootorder);
if(*rootorder==element)
break;
rootorder++;
}
//printf("secound element is %d\n", *rootorder);
int left_len = rootorder-mid_arr;
int *lefttree = head_arr+left_len;
if(left_len>0){
tree->left = constructtree(head_arr+1, lefttree, mid_arr, rootorder-1);
printf("left element is %d\t left_len is %d\n", tree->left->element, left_len);
}
if(left_len<end_head-head_arr){
tree->right = constructtree(lefttree+1, end_head, rootorder+1, end_mid);
printf("right element is %d\t left_len is %d\n", tree->right->element, left_len);
}
return tree;
}
static int tailview(Tree tree)
{
if(tree!=NULL){
tailview(tree->left);
printf("%d\n", tree->element);
tailview(tree->right);
}
return 0;
}
int main()
{
int head_arr[] = {1, 2, 4, 7, 3, 5, 6, 8};
int head_len = sizeof(head_arr)/sizeof(head_arr[0]);
int mid_arr[] = {4, 7, 2, 1, 5, 3, 8, 6};
int mid_len = sizeof(mid_arr)/sizeof(mid_arr[0]);
//printf("head_len is %d\n", head_len);
//printf("mid_len is %d\n", mid_len);
Tree tree = constructtree(head_arr, head_arr+head_len-1, mid_arr, mid_arr+mid_len-1);
//tailview(tree);
return 0;
}
先从左子树开始建立
右子树同理
构建二叉树如下所示:
已知二叉树的先序、中序排列和中序、后序排列都可以构造二叉树,但是已知二叉树的先序和后序是无法知道构建二叉树的。