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
- 1020. Tree Traversals (25)
- 1020. Tree Traversals (25)
- 1020. Tree Traversals (25)
- 1020. Tree Traversals (25)
- 1020. Tree Traversals (25)
- 1020. Tree Traversals (25)
- 1020. Tree Traversals (25)
- 1020. Tree Traversals (25)
- 1020. Tree Traversals (25)
- 1020. Tree Traversals (25)
- 1020. Tree Traversals (25)
- 1020. Tree Traversals (25)
- 1020. Tree Traversals (25)
- 1020. Tree Traversals (25)
- 1020. Tree Traversals (25)
- 1020. Tree Traversals (25)
- 1020. Tree Traversals (25)
- 1020. Tree Traversals (25)
- clamav-0.99.2的编译
- 简明python学习教程四--正则表达式
- Two Sum II
- 数据分析--iris dataset
- 设计模式——面向接口编程之柔性多态增强代码的可扩展性
- 1020. Tree Traversals (25)
- 简明python学习教程五--理解多线程编程
- 找朋友
- 人工智能简介
- 贪心算法(五)——迪杰斯特拉算法
- c++中的const
- java 初试利用spring开发接口(tomcat + netty + springmvc)
- MQTT协议通俗讲解
- iOS透明导航栏的平滑过渡(进阶版)