题目:由前序遍历和中序遍历重建二叉树(前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5)
思想:
代码如下:
Node* Rebuild(T prev[], T in[],int l, int r) //l为数组的开始开始位置的下标,r为数组最尾部数字的下标
{
if (_root != NULL)
{
Destroy(_root);
_root = NULL;
}
int n = 0;
_Rebuild(_root,prev, in, l, r,n);//递归重建二叉树
return _root;
}
private:
void _Rebuild(Node*& root, T prev[], T in[], int l, int r, int& n)
{
if (l <= r)
{
root = new Node(prev[n]);
}
else
{
root = NULL;
return;
}
int begin = l;
for (int i = l; i <= r; i++)
{
if (in[i] == prev[n])
{
l = i;
++n;
break;
}
}
_Rebuild(root->_left, prev, in, begin, l-1,n);
_Rebuild(root->_right, prev, in, l+1, r,n);
}
root传引用的原因:因为在递归的下一层new的新结点要连接到上一层结点的左孩子上或者右孩子上,则下一层的root等于上一层的root->_left / root->_right
n传引用的原因:因为n的变化影响整体,先序数组arr1[]只有被new之后才可以向后移动,否则n不变。