1020. Tree Traversals (25)

来源:互联网 发布:知鸟二维码图片 编辑:程序博客网 时间:2024/06/03 21:51

由后序、中序遍历还原树,先序遍历一下。

#include <iostream>#include <stdio.h>#include <string.h>#include <vector>#include <map>#include <stack>#include <queue>#include <algorithm>#include <set>using namespace std;int in[31],post[31];int n;struct node{  node *r,*l;  int d;};node *build(int s1,int e1,int s2,int e2){  node *root=new node;  root->l=root->r=NULL;  root->d=post[e1];  int idx=-1;  for(int i=s2;i<=e2;i++)    if(in[i]==root->d)    {        idx=i;      break;    }  if(idx==-1) return  NULL;  int len=idx-s2;  if(idx>s2)  //有左子树    root->l=build(s1,s1+len-1,s2,idx-1);  if(idx<e2)  //有右子树    root->r=build(s1+len,e1-1,idx+1,e2);  return root;}int main(){    //freopen("input.txt","r",stdin);  cin>>n;  for(int i=1;i<=n;i++)  cin>>post[i];  for(int i=1;i<=n;i++)  cin>>in[i];  node *root=build(1,n,1,n);  queue<node*> s;  s.push(root);  bool flag=true;  while(!s.empty()){    node *tmp=s.front();    if(flag)    {      cout<<tmp->d;       s.pop();       flag=false;    }    else    {      cout<<" "<<tmp->d;      s.pop();    }    if(tmp->l)      s.push(tmp->l);    if(tmp->r)      s.push(tmp->r);  }  cout<<endl;  return 0;}

#include <iostream>#include <stdio.h>#include <string.h>#include <vector>#include <map>#include <stack>#include <queue>#include <algorithm>#include <set>using namespace std;#define MAX 40int postOrder[MAX];int inOrder[MAX];int preOrder[MAX];int N;int cur;typedef struct Tree{    Tree *lchild;    Tree *rchild;    int data;}Tree;int findRootIndex(int rootNum){    for(int i=0;i<N;i++){        if(inOrder[i]==rootNum)            return i;    }    return -1;}Tree* buildTree_in_and_post(int left,int right){    if(left>right)        return NULL;    int root=postOrder[cur];    cur--;    int rootIndex=findRootIndex(root);    Tree *T=(Tree *)malloc(sizeof(Tree));    T->data=root;    if(left==right){        T->lchild=NULL;        T->rchild=NULL;    }else{        //这种做法要注意树的顺序,先右后左子树        T->rchild=buildTree_in_and_post(rootIndex+1,right);   T->lchild=buildTree_in_and_post(left,rootIndex-1);    }    return T;}void BFS(Tree *T){    bool firstout=true;    queue<Tree *> q;    q.push(T);    while(!q.empty()){        Tree *t=q.front();        q.pop();        if(firstout){            firstout=false;            printf("%d",t->data);        }        else            printf(" %d",t->data);    if(t->lchild!=NULL)        q.push(t->lchild);    if(t->rchild!=NULL)        q.push(t->rchild);    }}int main(){    scanf("%d",&N);    cur=N-1;    for(int i=0;i<N;i++)        scanf("%d",postOrder+i);    for(int i=0;i<N;i++)        scanf("%d",inOrder+i);    Tree *T=buildTree_in_and_post(0,cur);    BFS(T);    return 0;}  


0 0