劍指offer 面試題6 重建二叉樹

E:\arithmetic\RebuildBinaryTree

P55


#include <stdio.h>
#include "BinaryTree.h"
TreeNode* reverse(int *pre, int *in, int length );
TreeNode* construct	(int *pre, int *in, int length );
int main(int argc, char *argv[])
{//測試用例: 正常的兩個(完全二叉樹 ,不完全二叉樹);僅有左子樹,僅有右子樹 僅有一個元素; 兩個序列值不同, length<=0;序列爲NULL 
	int a[] = {10,6,4,8,14,12,16};
	int b[] = {4,6,8,10,12,14,16};
	TreeNode* root = reverse(a, b, sizeof(a)/sizeof(int));
	preOrder(root);
	printf("\n");
	inOrder(root);
	printf("\n");

	int a1[] = {1,2,4,7,3,5,6,8};
	int b1[] = {4,7,2,1,5,3,8,6};
	TreeNode* root0 = reverse(a1, b1, sizeof(a1)/sizeof(int));
	preOrder(root0);
	printf("\n");
	inOrder(root0);
	printf("\n");
	
	int c[] = {1};
	int d[] = {1}; 
	TreeNode* root2 = reverse(c, d, sizeof(c)/sizeof(int));
	preOrder(root2);
	printf("\n");
	inOrder(root2);
	printf("\n");
	
	int e[] = {1,2,4,7,3,9,6,8};
	int f[] = {4,7,2,1,5,3,8,6};
	TreeNode* root3 = reverse(e, f, sizeof(e)/sizeof(int));
	preOrder(root3);
	printf("\n");
	inOrder(root3);
	printf("\n");
	
	int a2[] = {1,2,4,7};
	int b2[] = {4,7,2,1};
	TreeNode* root6 = reverse(a2, b2, sizeof(a2)/sizeof(int));
	preOrder(root6);
	printf("\n");
	inOrder(root6);
	printf("\n");
	
	int a3[] = {1,3,5,6,8};
	int b3[] = {1,5,3,8,6};
	TreeNode* root7 = reverse(a3, b3, sizeof(a3)/sizeof(int));
	preOrder(root7);
	printf("\n");
	inOrder(root7);
	printf("\n");
	
	TreeNode* root4 = reverse(NULL, f, sizeof(e)/sizeof(int));
	TreeNode* root5 = reverse(e, f, -3);
	
	return 0;
}
TreeNode* reverse(int *pre, int *in, int length ){
	if( (pre==NULL) || (in==NULL) || length<=0)
	{
		printf("error, failed to reverse !\n");
		return NULL;
	}
//	return construct(pre, pre+length-1, in, in+length-1);
	return construct(pre, in, length);
}
TreeNode* construct	(int *pre, int *in, int length ){
	if(length == 0){//終止條件 length爲0 
		return NULL;
	}
	TreeNode *r = malloc(sizeof(TreeNode));
	r->value = pre[0];
	int i ;
	for(i=0 ; i<length ; i++){
//		printf("%d(%d)\t", *(in+i), *(pre+0));
		if(*(in+i) == *(pre+0))
			break;
	}
	if(i == length){
		printf("\nerror, two sequence is not equal!\n");
		return NULL;
	}
//	printf("***break***\n");
	r->lChild = construct(pre+1, in, i);
	r->rChild = construct(pre+i+1, in+i+1, length-i-1);
	return r;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章