浙大 PAT 1020. Tree Traversals (25)
2014-03-04 17:20
411 查看
1020. Tree Traversals (25)
时间限制400 ms
内存限制
32000 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (<=30), the total number of nodes in the binary tree. The second line gives the postorder sequence and the third line gives the inorder sequence. All the numbers
in a line are separated by a space.
Output Specification:
For each test case, print in one line the level order traversal sequence of the corresponding binary tree. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.
Sample Input:
7 2 3 1 5 7 6 4 1 2 3 4 5 6 7
Sample Output:
4 1 6 3 5 7 2
主要是根据后序和中序把二叉树构造出来,接下来就是一个队列bfs输出就可以了。
#include <cstdio> #include <cstdlib> #include <queue> using namespace std; const int maxx = 32; typedef struct Tree{ Tree *le; Tree *ri; int data; }Tree; Tree *root; int pos[maxx],in[maxx]; void printLevelOrder(Tree *root){ queue<Tree *> que; Tree *tr = NULL; que.push(root); bool flg = true; while(!que.empty()){ tr = (Tree *)que.front(); que.pop(); if(tr==NULL)continue; if(flg){ printf("%d",tr->data); flg = false; }else{ printf(" %d",tr->data); } que.push(tr->le); que.push(tr->ri); } printf("\n"); } //构造树pl为后序序列的左边界pr为其右边界 //il为中续遍历的左边界ir为其右边界 Tree *buildTree(int pl,int pr,int il,int ir){ if(pl>pr)return NULL; int p = il; while(in[p]!=pos[pr])++p; Tree *tree = (Tree *)malloc(sizeof(Tree)); tree->data = pos[pr]; tree->le = buildTree(pl,pr-ir+p-1,il,p-1); tree->ri = buildTree(pr-ir+p,pr-1,p+1,ir); return tree; } int main(){ int n,i; Tree *root; scanf("%d",&n); for(i=0;i<n;++i){ scanf("%d",&pos[i]); } for(i=0;i<n;++i){ scanf("%d",&in[i]); } root=buildTree(0,n-1,0,n-1); printLevelOrder(root); return 0; }
代码还是很简单的。
下面写了一下已知前序和中序构造树的方法,原理是一样的。
#include <cstdio> #include <cstdlib> #include <queue> using namespace std; const int maxx = 32; typedef struct Tree{ Tree *le; Tree *ri; int data; }Tree; Tree *root; int pre[maxx],in[maxx]; void printLevelOrder(Tree *root){ queue<Tree *> que; Tree *tr = NULL; que.push(root); bool flg = true; while(!que.empty()){ tr = (Tree *)que.front(); que.pop(); if(tr==NULL)continue; if(flg){ printf("%d",tr->data); flg = false; }else{ printf(" %d",tr->data); } que.push(tr->le); que.push(tr->ri); } printf("\n"); } //构造树pl为前序序列的左边界pr为其右边界 //il为中续遍历的左边界ir为其右边界 Tree *buildTree(int pl,int pr,int il,int ir){ if(pl>pr)return NULL; int p = il; while(in[p]!=pre[pl])++p; Tree *tree = (Tree *)malloc(sizeof(Tree)); tree->data = pre[pl]; tree->le = buildTree(pl+1,pl+p-il,il,p-1); tree->ri = buildTree(pl+p-il+1,pr,p+1,ir); return tree; } void printPre(Tree *root){ if(root==NULL)return; printf("%d ",root->data); printPre(root->le); printPre(root->ri); } int main(){ int n,i; Tree *root; scanf("%d",&n); for(i=0;i<n;++i){ scanf("%d",&pre[i]); } for(i=0;i<n;++i){ scanf("%d",&in[i]); } root=buildTree(0,n-1,0,n-1); printLevelOrder(root); //printPre(root); return 0; }
相关文章推荐
- 浙大 PAT Advanced level 1020. Tree Traversals (25)
- 浙大PAT (Advanced Level) Practise 1020 Tree Traversals (25)
- 浙大PAT 1020. Tree Traversals (25)
- 浙大PAT 1020. Tree Traversals (25)
- 【C++】浙大PAT (Basic Level)1020. 月饼 (25)
- [PAT]1020. Tree Traversals (25)
- PAT (Advanced) 1020. Tree Traversals (25)
- pat甲级1020. Tree Traversals (25)
- PAT: 1020. Tree Traversals (25)
- PAT 1020. Tree Traversals (25) 根据树的中序与后序,求层序
- pat 1020. Tree Traversals (25)
- PAT 1020 Tree Traversals (25)
- PAT-A-1020. Tree Traversals (25)
- PAT(A) - 1020. Tree Traversals (25)
- PAT (Advanced Level) Practise 1020 Tree Traversals (25)
- 【PAT】1020. Tree Traversals (25)
- PAT (Advanced Level) 1020. Tree Traversals (25)
- PAT 1020. Tree Traversals (25)(树的构造与遍历,通过后序中序输出层次遍历)
- 【PAT】1020. Tree Traversals (25)
- PAT甲级 1020. Tree Traversals (25)