03-树3 Tree Traversals Again (25 分)
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.
Figure 1
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer 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
思路
- 树的遍历中,除根节点以外其他节点每个结点被访问三次,push一次,pop一次,pop一次因而题目转换成了已知先序和中序求后序
- 具体思路为每次递归求出子树的根节点
- vector 类型的数组 参数从 int a[] 变成 vector < int > a
例子
pre : 1 2 3 4 5 6
mid : 3 2 4 1 6 5
post: 3 4 2 6 5 1
Codes
#include<iostream>
#include<stack>
#include<string>
#include<vector>
using namespace std;
void getPostOrder(vector<int> pre, int preL, vector<int> mid, int midL,vector<int> &post, int postL, int n) //preL midL postl is pointer
{
if (n == 0) return ;
if (n == 1) {
post[postL] = pre[preL];
return ;
}
int root = pre[preL];
post[postL + n - 1] = root;
int i = 0;
while (i < n) {
if (mid[midL + i] == root) break;
i++;
}
int L = i, nodesnum = n - i - 1;
getPostOrder(pre, preL + 1, mid, midL, post, postL, L);
getPostOrder(pre, preL + L + 1, mid, midL + L + 1, post, postL + L, nodesnum);
}
int main() {
int num;
cin >> num;
vector <int> pre(num, 0) , mid(num, 0), post(num, 0);
stack<int> s;
int i = 0;
for(int cnt = 0; i < num; ){
string temp ;
int tempdata;
cin >> temp;
if(temp == "Push"){
cin >> tempdata;
pre[cnt] = tempdata;
s.push(tempdata);
cnt++;
}
else{
mid[i++] = s.top();
s.pop();
}
}
getPostOrder(pre, 0, mid, 0 , post, 0 , num);
for(int i = 0; i < num; i++) {
if(i < num -1) cout << post[i] << " ";
else cout << post[i];
}
return 0;
}
Code2 dfs
#include<bits/stdc++.h>
using namespace std;
vector<int> res;
int num;
int a[10010] , intern[10010];
int cnt = 0;
int ready = 0;
void Dfs(int n){
if(ready == 2) return;
int tempdata;
string temp;
cin >> temp;
if(temp == "Push"){
cin >> tempdata;
a[cnt++] = tempdata;
}else {
if(cnt == num){
ready ++;
}
return;
}
Dfs(n * 2 + 1);
Dfs(n * 2 + 2);
res.push_back(tempdata);
}
int main(){
cin >> num;
Dfs(0);
for(int i = 0; i < num; i++){
if( i== 0) cout << res[i];
else cout << " " << res[i];
}
return 0;
}