二叉树后序遍历
接收二叉树前序序列和中序序列(各元素各不相同),输出该二叉树的后序序列。
格式
输入格式
输入有三行:
第一行为数字n。
第二行有n个数字,表示二叉树的前序遍历。
第三行有n个数字,表示二叉树的中序遍历。
输出格式
输出一行,表示该二叉树的后序遍历序列。
样例
输入
5
1 2 4 5 3
4 2 5 1 3
输出
4 5 2 3 1
#include<iostream>
using namespace std;
template<class T>
struct binaryTreeNode
{
T element;int leaves;
binaryTreeNode<T> *leftChild,*rightChild; //左子树和右子树
};
template<class T>
void erase(binaryTreeNode<T>*& proot)
{
if(proot!=NULL)
{
erase(proot->leftChild);
erase(proot->rightChild);
delete proot;
proot=NULL;
}
}
template<class T>
class binaryTree{
public:
binaryTree(){root=NULL;}//构造函数
~binaryTree(){erase(root);}//析构函数
void postOrder(binaryTreeNode<T>* t);
binaryTreeNode<T>* makeTree(T* preOrder,T* inOrder,
int P0,int Pn,int I0,int In);//中序遍历和前序遍历数组
private:
binaryTreeNode<T> *root;
static void (*visit)(binaryTreeNode<T>*);
};
template<class T>
void (*binaryTree<T>::visit)(binaryTreeNode<T>*);
template<class T>
void binaryTree<T>::postOrder(binaryTreeNode<T> *t)
{// Postorder traversal.
if (t != NULL)
{
postOrder(t->leftChild);
postOrder(t->rightChild);
//binaryTree<T>::visit(t);
cout<<t->element<<" ";
}
}
template<class T>
binaryTreeNode<T>* binaryTree<T>::makeTree(T* preOrder,T* inOrder,
int P0,int Pn,int I0,int In)
{
int i;
binaryTreeNode<T> *tr=new binaryTreeNode<T>;
tr->element=preOrder[P0];
tr->leftChild= NULL;
tr->rightChild = NULL;
if(P0==Pn&&I0==In)//只有一个元素时
return tr;
//还原一棵树
for(i=I0;i<=In;i++)
if(preOrder[P0]==inOrder[i])
break;
int leftLength=i-I0;//左孩子数量
int rightLength=In-i;//右孩子数量
if(leftLength>0)
tr->leftChild=makeTree(preOrder,inOrder,P0+1,P0+leftLength,I0,i-1);
if(rightLength>0)
tr->rightChild=makeTree(preOrder,inOrder,P0+leftLength+1,Pn,i+1,In);
root=tr;
return tr;
}
int main()
{
binaryTree<int> tre;
int *preOrder,*inOrder,n;
cin>>n;
preOrder=new int[n];
inOrder=new int[n];
for(int i=0;i<n;i++)
cin>>preOrder[i];
for(int j=0;j<n;j++)
cin>>inOrder[j];
binaryTreeNode<int> *p=tre.makeTree(preOrder,inOrder,0,n-1,0,n-1);
tre.postOrder(p);
return 0;
}