PAT----A1086 Tree Traversals Again (25point(s))

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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值