A1086 Tree Traversals Again (25point(s))
题意
通过栈的方式给出一棵二叉树,输出后序遍历。
思路
我的第一直觉是题目的方式刚好和先序遍历满二叉树相似,于是就以n为高度(最坏情况)构造静态二叉树,结果最后一个测试点超内存了,想想一开始就以n为高度是不合理的,因为会浪费大量的内存。所以改成了当需要的时候再resize,但是因为是静态二叉树所以还会浪费一些内存,但是也ac了。
正确解法是用先序和中序遍历建树来做,这样建立的就是动态二叉树,不会浪费内存。
一般输入的是完全二叉树的情况才用静态二叉树。
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"
using namespace std;
bool blank = false;
void posOrder(vector<int>& a,int id){
if(id >= a.size() || a[id]==-1)
return;
posOrder(a,id*2);
posOrder(a,id*2+1);
if(blank)
printf(" ");
else
blank = true;
printf("%d",a[id]);
}
int n;
vector<int> a;
void dfs(int id,int &cnt){
if(cnt >= n)
return;
if(id >= a.size()) {
int oldSize = a.size();
a.resize(id+1);
fill(a.begin()+oldSize,a.begin()+a.size(),-1);
}
string s1 ; cin >> s1;
if(s1 == "Pop"){
a[id] = -1;
cnt ++;
return;
}else{
scanf("%d",&a[id]);
dfs(2*id,cnt);
dfs(2*id+1,cnt);
}
}
int main(){
// freopen("input.txt","r",stdin);
cin >> n;
// int num = pow(2,n)-1; // 1,3,7,15....
// a.resize(num+1);
fill(a.begin(),a.begin()+a.size(),-1);
int id = 1;
int cnt = 0;
dfs(1,cnt);
posOrder(a,1);
}