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