题目:
输入某二叉树的前序遍历和中序遍历的结果,构建该二叉树。
代码如下:
//用于学习用途
//主要算法归剑指offer原作者所有
#include <iostream>
using namespace std;
//const int MaxSize=100;
//没用到
struct BinaryTreeNode{
int m_nValue;
BinaryTreeNode *m_pLeft;
BinaryTreeNode *m_pRight;
} ;
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->m_nValue=rootValue;
root->m_pLeft=root->m_pRight=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->m_pLeft=ConstructCore(startPreorder+1,leftPreorderEnd,startInorder,rootInorder-1);
}
if(leftLength<endPreorder-startPreorder)//构建右子树
{
root->m_pRight=ConstructCore(leftPreorderEnd+1,endPreorder,rootInorder+1,endInorder);
}
return root;
}
void print(BinaryTreeNode *root)//输出树的前序遍历结果
{
if(root==NULL)
return ;
else
cout<<root->m_nValue<<"\t";
print(root->m_pLeft);
print(root->m_pRight);
}
void main(){
int preorder[]={1,2,4,7,3,5,6,8};//前序
int inorder[]={4,7,2,1,5,3,8,6};//中序
BinaryTreeNode * root=Construct(preorder,inorder,8);
print(root);
}