#include <iostream>
using namespace std;
void func(int* pre, int* mid, int pre_left, int pre_right,
int mid_left, int mid_right)
{
if(pre_left == pre_right)
{
cout<<pre[pre_left]<<" ";
return ;
}
int left_i=pre_left, mid_i=mid_left;
while(mid_i<=mid_right)
{
if(pre[pre_left] == mid[mid_i])
{
func(pre, mid, pre_left+1, left_i, mid_left, mid_i-1);
func(pre, mid, left_i+1, pre_right, mid_i+1, mid_right);
cout<<pre[pre_left]<<" ";
break;
}else{
mid_i++;
left_i++;
}
}
}
int main(void)
{
int pre[] = {8,5,2,6,13,10,15};
int mid[] = {2,5,6,8,10,13,15};
int n = sizeof(pre)/sizeof(pre[0]);
func(pre, mid, 0, n-1, 0, n-1);
return 0;
}
写的有点复杂,下面的简单点儿:
/*
pre-order: {1,2,4,7,3,5,6,8}
in-order: {4,7,2,1,5,3,8,6}
*/
TNode* rebuild_BTree(int* pre_order, int *in_order, int len)
{
if(pre_order==NULL || in_order==NULL || len==0)
return NULL;
TNode* h = new TNode;
h->m_nValue = *pre_order;
int* in_h = in_order;
while(*in_h != *pre_order)
in_h++;
int l_len, r_len;
l_len = in_h-in_order;
h->m_pLeft = rebuild_BTree(pre_order+1, in_order, l_len);
r_len = len-(in_h-in_order+1);
h->m_pRigh = rebuild_BTree(pre_order+(len-r_len), in_h+1, r_len);
return h;
}