題目:由前序遍歷和中序遍歷重建二叉樹(前序序列: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不變。