-
题目描述:
-
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。
-
重建二叉树算法:
bool ReBuildBiTree(BiNode **root, int *preorder, int *inorder, int len)
{
if (preorder == NULL || inorder == NULL)
{
return false;
}
BiNode *pTmp = new BiNode;
pTmp->data = *preorder;
pTmp->lchild = NULL;
pTmp->rchild = NULL;
if (*root == NULL)
{
*root = pTmp;
}
if (len == 0)
{
if (*preorder == *inorder)
return true;
else
return false;
}
int *pRootIn = inorder;
int lchild_len = 0;
int rchild_len = 0;
while(lchild_len <= len)
{
if (*pRootIn == *preorder)
{
break;
}
++pRootIn;
++lchild_len;
}
if (lchild_len > len)
{
return false;
}
rchild_len = len - lchild_len - 1;
if (lchild_len > 0)
{
if(!ReBuildBiTree(&(*root)->lchild, preorder + 1, inorder, lchild_len))
return false;
}
if (rchild_len > 0)
{
if(!ReBuildBiTree(&(*root)->rchild, preorder + lchild_len + 1, inorder + lchild_len + 1, rchild_len))
return false;
}
return true;
}