1、二叉树的前序中序转后序:
先通过前序中序建树,再进行后序遍历。
(1)建树:每次记录先序遍历的根,中序遍历的范围;
先找到根在中序遍历中的位置,然后找到左子树,右子树;
分别找到左子树的根和范围与右子树的根和范围。
递归下去,直到st>ed.
(2)后序遍历;
#include<iostream> #include<cstdio> #include<vector> #include<cstring> #include<cstdlib> using namespace std; vector <int> level(10000,-1); struct Node{ int data; struct Node *Left,*Right; }; typedef struct Node* Tree; Tree T; int pre[1000],in[1000],n; Tree f(int root,int st,int ed) { int i,d; if(st>ed) return NULL; Tree tp=(Tree)malloc(sizeof(struct Node)); tp->data=pre[root]; for(i=st;i!=ed;i++) if(pre[root]==in[i]) break; tp->Left=f(root+1,st,i-1); tp->Right=f(root+(i-st)+1,i+1,ed); return tp; } void Print(Tree T) { if(T!=NULL) { Print(T->Left); Print(T->Right); printf("%d ",T->data); } } int main(void) { int i,j; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&pre[i]); for(i=0;i<n;i++) scanf("%d",&in[i]); Tree T=f(0,0,n-1); Print(T); return 0; } /* 7 1 2 4 5 3 6 7 4 2 5 1 6 3 7 */