重建二叉树
题目描述
输入二叉树前序遍历和中序遍历,重建二叉树
先序找根节点,中序固定位置;递归
BinaryTreeNode *Construct(int *preorder, int *inorder, int length)
{
if(preorder ==nullptr || inorder == nullptr || length<=0)
{
return nullptr;
}
return ConstructCore(preorder, preorder + length-1, inorder, inorder +length -1);
}
BinaryTreeNode(int *startpreorder, int *endpreorder, int *startinorder, int *endorder)
{
int rootValue = startpreorder[0];
BinaryTreeNode *root = new BinaryTreeNode();
root->m_nValue = rootValue;
root->m_pLeft = root->m_pRight = nullptr;
if(startpreorder == endpreorder)
{
if(startinorder == endinorder && *startpreorder == *startinorder)
{
return nullptr;
}
else throw std::exception("Invalid input");
}
int *rootInorder = startinorder;
while(rootInorder <= endinorder && *rootInorder != rootValue)
{
++rootInorder;
}
if(rootInorder == endInorder && *rootInder != rootValue)
{
throw std::exception("Invalid");
}
int leftLength = rootInorder - startinorder;
int *leftPreorderEnd = startinorder + leftLength;
if(leftLength>0)
{
root->m_pLeft = ConstructCore(startpreorder + 1, leftPreorderEnd, startinorder, rootInorder-1)
}
if(leftLength <endpreorder - startpreorder)
{
root->m_pRight = ConstructCore(startpreorder+leftLength+1, endinorder, endPreorder, rootInorder+1, endinorder);
}
return root;
}
大问题->小问题