03-树3 Tree Traversals Again
2016-05-16 23:23
381 查看
An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stack operations are: push(1); push(2); push(3); pop(); pop(); push(4); pop(); pop(); push(5); push(6); pop(); pop(). Then a unique binary tree (shown in Figure 1) can be generated from this sequence of operations. Your task is to give the postorder traversal sequence of this tree.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (N≤30) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to N). Then 2N lines follow, each describes a stack operation in the format: “Push X” where X is the index of the node being pushed onto the stack; or “Pop” meaning to pop one node from the stack.
Output Specification:
For each test case, print the postorder traversal sequence of the corresponding tree in one line. A solution is guaranteed to exist. All the numbers must be separated by exactly one space, and there must be no extra space at the end of the line.
Sample Input:
6
Push 1
Push 2
Push 3
Pop
Pop
Push 4
Pop
Pop
Push 5
Push 6
Pop
Pop
Sample Output:
3 4 2 6 5 1
思路:其实就是根据先序遍历和中序遍历构造出后序遍历。用递归处理时最好在纸上写清楚
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (N≤30) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to N). Then 2N lines follow, each describes a stack operation in the format: “Push X” where X is the index of the node being pushed onto the stack; or “Pop” meaning to pop one node from the stack.
Output Specification:
For each test case, print the postorder traversal sequence of the corresponding tree in one line. A solution is guaranteed to exist. All the numbers must be separated by exactly one space, and there must be no extra space at the end of the line.
Sample Input:
6
Push 1
Push 2
Push 3
Pop
Pop
Push 4
Pop
Pop
Push 5
Push 6
Pop
Pop
Sample Output:
3 4 2 6 5 1
思路:其实就是根据先序遍历和中序遍历构造出后序遍历。用递归处理时最好在纸上写清楚
#include<cstdio> #include<cstring> #include<stack> using namespace std; const int maxn=32; int pre_order[maxn],in_order[maxn],post_order[maxn],N; void solve(int left1,int right1,int left2,int right2,int left3,int right3){ if(left1>right1) return;//终止条件 int L,root=pre_order[left1]; post_order[right3]=root; for(int i=left2;i<=right2;i++){ if(in_order[i]==root){ L=i; break; } } solve(left1+1,left1+L-left2,left2,L-1,left3,left3+L-left2-1); solve(left1+L-left2+1,right1,L+1,right2,left3+L-left2,right3-1); } int main(){ //freopen("in.txt","r",stdin); int n,index1=0,index2=0,val; char str[10]; stack<int>s; scanf("%d",&N); n=2*N; while(n--){ scanf("%s",str); if(str[1]=='u'){ scanf("%d",&val); pre_order[index1++]=val; s.push(val); }//push为先序遍历 else if(str[1]=='o'){ in_order[index2++]=s.top();//pop为后序遍历 s.pop(); } } solve(0,N-1,0,N-1,0,N-1); printf("%d",post_order[0]); for(int i=1;i<N;i++) printf(" %d",post_order[i]); printf("\n"); return 0; }
相关文章推荐
- 文件遍历排序函数
- Lua 学习笔记之C API 遍历 Table实现代码
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#中遍历Hashtable的4种方法
- Erlang中遍历取出某个位置的最大值代码
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- C++实现图的邻接表存储和广度优先遍历实例分析
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
- C++非递归队列实现二叉树的广度优先遍历
- php遍历目录方法小结
- 一个目录遍历函数
- php遍历删除整个目录及文件的方法
- PHP遍历文件夹与文件类及处理类用法实例
- PHP遍历XML文档所有节点的方法
- php中使用key,value,current,next和prev函数遍历数组的方法
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- C#使用foreach遍历哈希表(hashtable)的方法
- php递归遍历多维数组的方法
- C#使用yield关键字让自定义集合实现foreach遍历的方法
- C#常见的几种集合 ArrayList,Hashtable,List<T>,Dictionary<K,V> 遍历方法对比