题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。
#include<iostream>
using namespace std;
struct BinaryTreeNode
{
int value;
BinaryTreeNode *left;
BinaryTreeNode *right;
};
BinaryTreeNode * construct(int *preorder,int *inorder,int length);
BinaryTreeNode * constructcore(int *startpreorder,int *endpreorder,int *startinorder,int *endinorder);
BinaryTreeNode* construct(int *preorder,int *inorder,int length)
{
if(preorder==NULL||inorder==NULL||length<=0)
return NULL;
return constructcore(preorder,preorder+length-1,inorder,inorder+length-1);
}
BinaryTreeNode* constructcore(int *startpreorder,int *endpreorder,int *startinorder,int *endinorder)
{
int rootvalue=startpreorder[0];
BinaryTreeNode *root=new BinaryTreeNode();
root->value=rootvalue;
root->left=root->right=NULL;
if(startpreorder==endpreorder)
{
if(startinorder==endinorder&&*startpreorder==*startinorder)
return root;
else
throw std::exception("Invalid input");
}
int *rootinorder=startinorder;
while(rootinorder<=endinorder&&*rootinorder!=rootvalue)
++rootinorder;
if(rootinorder==endinorder&&*rootinorder!=rootvalue)
throw std::exception("Invalid input");
int leftlength=rootinorder-startinorder;
int *leftpreorderend=startpreorder+leftlength;
if(leftlength>0)
{
root->left=constructcore(startpreorder+1,leftpreorderend,startinorder,rootinorder-1);
}
if(leftlength<endpreorder-startpreorder)
{
root->right=constructcore(leftpreorderend+1,endpreorder,rootinorder+1,endinorder);
}
return root;
}
void showroot(BinaryTreeNode *root)
{
if(root!=NULL)
{
if(root->left!=NULL)
showroot(root->left);
if(root->right!=NULL)
showroot(root->right);
cout<<root->value<<" ";
}
}
int main()
{
int pre[]={1,2,4,7,3,5,6,8};
int in[]={4,7,2,1,5,3,8,6};
BinaryTreeNode *root;
root=construct(pre,in,8);
showroot(root);
return 1;
}