题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树并输出头结点。假设输入的前序遍历和中序遍历的结果中不含重复的数字。
代码:
//题目示例
//先序遍历:1 2 4 7 3 5 6 8
//中序遍历:4 7 2 1 5 3 8 6
//构建普通二叉树
// 1
// / \
// 2 3
// / / \
// 4 5 6
// \ /
// 7 8
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_nLeft;
BinaryTreeNode* m_nRight;
};
BinaryTreeNode* ConstructTreeCore(int* startPreorder,int* endPreorder,int* startInorder,int* endInorder)
{
//前序遍历第一个数字是根结点的值
int rootValue=startPreorder[0];
BinaryTreeNode* root=new BinaryTreeNode();
root->m_nValue=rootValue;
root->m_nRight=NULL;
root->m_nLeft=NULL;
if(startPreorder==endPreorder)
{
if(startInorder==endInorder && *startPreorder==*endPreorder)
return root;
else
throw std::exception("Invalid input.");
}
//在中序遍历中找到根结点的值
int* rootInorder=startInorder;
while(rootInorder<=endInorder && *rootInorder!=rootValue)
++rootInorder;
if(rootInorder==endInorder && *rootInorder!=*endInorder)
throw std::exception("Invalid input");
int leftLength=rootInorder-startInorder;
int* leftPreorderEnd=startPreorder+leftLength;
if(leftLength>0)
{
//构建左子树
root->m_nLeft=ConstructTreeCore(startPreorder+1,leftPreorderEnd,startInorder,rootInorder-1);
}
if(leftLength<endPreorder-startPreorder)
{
//构建右子树
root->m_nRight=ConstructTreeCore(leftPreorderEnd+1,endPreorder,rootInorder+1,endInorder);
}
return root;
}
BinaryTreeNode* ConstructTree(int* preorder,int* inorder,int length)
{
if(preorder==NULL || inorder==NULL)
return NULL;
return ConstructTreeCore(preorder,preorder+length-1,inorder,inorder+length-1);
}