构建二叉树后,用dfs()后序遍历
#include <bits/stdc++.h>
using namespace std;
const int M=110;
int preorder[M],inorder[M];
struct Node
{
int key;
Node *l,*r;
Node(int key):key(key),l(NULL),r(NULL){}
};
//pl,pr是前序,il,ir是中序
Node* build(int pl,int pr,int il,int ir)
{
if(pl>pr) return NULL;
//先从前序中找出根节点preorder[pl]
Node *root=new Node(preorder[pl]);
//下面是要知道这个根节点对应的值在中序序列中的位置k,好利用中序序列划分左右子树集合
int k=il;
while(inorder[k]!=root->key)
{
k++;
}
//有了中序序列中根节点的位置k,可以知道左集合的长度和右集合的长度
if(k>il)
root->l=build(pl+1,pr-ir+k,il,k-1); //左子树
if(k<ir)
root->r=build(pr-ir+k+1,pr,k+1,ir); //右子树
return root;
}
Node *post_order_traverse(Node *root)
{
if(root==NULL) return NULL;
if(root->l)
post_order_traverse(root->l);
if(root->r)
post_order_traverse(root->r);
cout<<root->key<<" ";
}
int main()
{
int n;
cin>>n;
for(int i=0;i<=n-1;i++)
{
cin>>preorder[i];
}
for(int i=0;i<=n-1;i++)
{
cin>>inorder[i];
}
Node *root=build(0,n-1,0,n-1);
post_order_traverse(root);
return 0;
}