C语言实现重建二叉树根据前序和中序遍历序列

理解:

在树相关的数据结构中经常利用递归思想,这是因为本身树的定义就是利用递归构成的。
举个例子:树的每一个子树又是一棵树,那么你前序遍历一棵树,就要从最小的子树开始,也就是说每一个子树的节点在序列中的相对位置,都是满足前序遍历的。
那么我们就可以利用递归来进行重建二叉树。

分析:

拥有的条件:1.二叉树前序序列。 2.二叉树的中序遍历。3.序列的长度。
     (1)根据前序序列,可以确定根节点数值,利用根节点数值和中序序列可以确定中序序列根节点的位置。
     (2)中序序列根节点的左边为左子树,右边为右子树,进而可以确定,左子树的个数,右子树的个数,中序序列中左右子树的范围位置。
     (3)前序序列中紧挨着根节点(前序序列的第一个位置)的就是左子树,根据上面得到的左子树的个数,可以确定前序序列中左右子树的范围位置。
根据(1)(2)(3)是不是又得到了左子树的前序,中序序列,以及序列的长度,也就是左子树的1,2,3. 同理还有右子树的1,2,3.
同理也就可以得到任意小子树的前序中序序列,而每一个节点的左右子树的根节点就是其左右子树的前序序列的第一个节点

那我们就只需做两件事:【1】将输入前序序列的第一个节点保存为根节点。
【2】根据当前序列,分出左右子树的前序中序序列,递归这两件事。

上核心代码:

binarytreeroot_ptr rebulit_binarytree(int *start_preorder, int *end_preorder, int *start_inorder, int * end_inorder){
   
	
	int lchild_length;
	binarytreeroot_ptr root;
	root = (binarytreeroot_ptr)malloc(sizeof(binarytreenode));
	root->data = *start_preorder;
	root->lchild = NULL;
	root->rchild = NULL;
	lchild_length = Find_location(start_preorder[0],start_inorder);
	printf("\t在中序当中的位置为:%d \n", lchild_length);
	if(start_preorder == end_preorder && start_inorder == end_inorder){
   
		if (*start_preorder == *start_inorder){
   
			return root;//叶子结点(只有自己,所有的序列都是自己) 
		}
	}
	if(lchild_length > 0) {
   
		root->lchild = rebulit_binarytree(start_preorder+1, start_preorder + lchild_length, start_inorder, start_inorder + lchild_length- 1);
	}
	if((start_inorder + lchild_length) < end_inorder){
   
		root->rchild = 

你可能感兴趣的:(C语言,二叉树,遍历,二叉树,指针,数据结构,算法,c语言)