【构建二叉树】

根据先序和中序构建二叉树

#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;
}

先从左子树开始建立

右子树同理

构建二叉树如下所示:

已知二叉树的先序、中序排列和中序、后序排列都可以构造二叉树,但是已知二叉树的先序和后序是无法知道构建二叉树的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值