在二叉树的前序遍历序列中,第一个数字总是树的根节点的值。中序遍历序列中,根节点的值位于序列的中间,左子树的结点位于序列的左边,右子树的结点位于序列的右边。所以要扫描中序遍历序列,得到根节点的位置。
在中序遍历序列找到根节点的位置后,则根节点左边的序列为左子树的结点,右子树的结点位于根节点的右边序列。此时将左右子树的大小l_size和r_size记录下来。在前序遍历序列中,左子树结点即为根节点之后的l_size个结点,右子树结点为左子树结点之后的r_size个结点。
实现例程如下,重建后打印二叉树的后序遍历序列:
#include<iostream>
using namespace std;
struct BinaryTree{
int val;
BinaryTree *left;
BinaryTree *right;
};
BinaryTree *Construct(int *preorder,int *inorder,int startPre,int endPre,int startIn,int endIn)
{
if(preorder==NULL||inorder==NULL||(endPre-startPre)!=(endIn-startIn))
return NULL;
int rootValue=preorder[startPre];
int pos;
for(int i=startIn;i<=endIn;i++)
{
if(inorder[i]==rootValue)
{
pos=i;
break;
}
}
BinaryTree *root=new BinaryTree();
root->val=rootValue;
root->left=root->right=NULL;
if(pos-startIn>0)
{
root->left=Construct(preorder,inorder,startPre+1,startPre+pos-startIn,startIn,pos-1);
}
if(endIn-pos>0)
{
root->right=Construct(preorder,inorder,startPre+pos-startIn+1,endPre,pos+1,endIn);
}
return root;
}
void PostOrderTraverse(BinaryTree *root)
{
if(root->left)
PostOrderTraverse(root->left);
if(root->right)
PostOrderTraverse(root->right);
cout<<root->val<<" ";
}
int main()
{
int preorder[]={1,2,4,7,3,5,6,8};
int inorder[]={4,7,2,1,5,3,8,6};
BinaryTree *root=Construct(preorder,inorder,0,sizeof(preorder)/sizeof(preorder[0])-1,0,sizeof(inorder)/sizeof(inorder[0])-1);
PostOrderTraverse(root);
return 0;
}