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
结尾无空行
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef struct
{
int left,right;
} node;
vector<node>tree(32);
int flag=1;
int buildTree()
{
vector<int>s;
int n,t,top=0,root=0;
cin>>n;
for(int i=0; i<2*n; i++)
{
string oper;
cin>>oper;
if(oper=="Push")
{
cin>>t;
s.push_back(t);
if(i==0)
{
root=t;
}
if(tree[top].left==0)
{
tree[top].left=t;
}
else
{
tree[top].right=t;
}
top=t;
}
else
{
top=s.back();
s.pop_back();
}
}
return root;
}
void postorder(int root)
{
if(root != 0)
{
postorder(tree[root].left);
postorder(tree[root].right);
if(flag)
{
flag=0;
cout<< root;
}
else
cout<< " "<< root;
}
}
int main()
{
// system("chcp 65001");
cin.tie(0);
cout.tie(0);
// freopen("C:/Users/zhaochen/Desktop/input.txt", "r", stdin);
int root=buildTree();
postorder(root);
return 0;
}
V2_递归
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;
vector<int>preorder,inorder;
int flag=1;
void buildTree(int n)
{
vector<int>s;
int t;
for(int i=0; i<2*n; i++)
{
string oper;
cin>>oper;
if(oper=="Push")
{
cin>>t;
preorder.push_back(t);
s.push_back(t);
}
else
{
inorder.push_back(s.back());
s.pop_back();
}
}
}
void pushroot(int preL,int inL,int n,vector<int>&postorder)
{
// preL为当前preorder的第一个元素下标,inL同理,n为当前子树有几个结点
if(n==0)
{
return;
}
int root=preorder[preL],i;
postorder.push_back(root); // 根结点入栈
for(i=0; i<n; i++)
{
if(inorder[i+inL] == root)
{
break;
// i+inL为root在inorder中的下标,左子树有i个,右子树n-1-i个
}
}
pushroot(preL+1+i,inL+i+1,n-1-i,postorder); // 递归右子树
pushroot(preL+1,inL,i,postorder); // 递归左子树
}
int main()
{
// system("chcp 65001");
cin.tie(0);
cout.tie(0);
// freopen("C:/Users/zhaochen/Desktop/input.txt", "r", stdin);
int n;
cin>>n;
buildTree(n);
vector<int>postorder;
pushroot(0,0,n,postorder);
for(int i=n-1; i>=0; i--)
{
if(i == 0)
cout<< postorder[i];
else
cout<< postorder[i]<< " ";
}
return 0;
}