思路
根据前序和中序的特性,前序序列的一个元素就是树的根元素,那么在中序序列找到相应的元素。找到后该元素前面所有元素都是左子树元素,后面元素都是右子树元素。那么此时跟节点的pleft就是左子树返回的结果,pright就是右子树返回的结果,使之递归即可,递归出口就是前序区间只有一个元素时。
Node* _rebuilt_In_pre_order(int *prestart, int*preEnd, int*Instart, int*InEnd)
{
int *left_end = Instart;
Node*Root = new Node(prestart[0]);
if (prestart == preEnd)
{
if(Instart==InEnd&&prestart[0] == Instart[0])
return Root;
else {
cerr << "输入有误" << endl;
exit(1);
}
}
while (left_end <= InEnd&&prestart[0] != *left_end)
{
left_end++;
}
if (left_end > InEnd){
cerr << "输入有误" << endl;
exit(2);
}
int left_length = left_end - Instart;
int *left_pre_end = prestart + left_length;
if (left_length>0)
{
Root->_PLeft = _rebuilt_In_pre_order(prestart+1, left_pre_end, Instart, left_end - 1);//将左子树区间输入该函数,返回一个左子树的节点出来赋值给根的左
}
if (left_end < InEnd)
{
Root->_PRight = _rebuilt_In_pre_order(prestart + 1 + left_length, preEnd, left_end + 1, InEnd);
}
return Root;
}
Node *rebuilt_In_pre_order(int * pre, int * In, int length)
{
if (pre == NULL || In == NULL || length <= 0)
return NULL;
return _rebuilt_In_pre_order(pre, pre + length - 1, In, In + length - 1);
}