PAT A 1133 AC代码(两种输出方式)

跑一遍序列,根据要求分别将结点标记存入v1、v2、v3

我二刷时用ans数组合并了v1、v2、v3,再进行输出会方便很多,不然的话需要分别考虑v1、v2、v3是否为空的情况(原本我是那样写的,如果是那样写的同学要注意一下只有v2是空的情况)

两种我都放在这

不推荐去记录新序列的下一节点,那样也要分别讨论是否非空的几种情况,也比较麻烦

合并输出的写法:

#include<iostream>
#include<vector>
using namespace std;
struct node{
	int num;
	int next;
}Node[100005];
int root,N,K;
vector<int> v1,v2,v3,ans;
void go(int index){
	if(index==-1) return;
	if(Node[index].num<0){
		v1.push_back(index);
	}else if(Node[index].num<=K){
		v2.push_back(index);
	}else{
		v3.push_back(index);
	}
	go(Node[index].next);
}
int main(){
	cin>>root>>N>>K;
	for(int i=0;i<N;i++){
		int index;
		scanf("%d",&index);
		scanf("%d %d",&Node[index].num,&Node[index].next);
	}
	go(root);
	ans.insert(ans.end(),v1.begin(),v1.end());
	ans.insert(ans.end(),v2.begin(),v2.end());
	ans.insert(ans.end(),v3.begin(),v3.end());
	for(auto it=ans.begin();it!=ans.end();it++){
		if(it==ans.begin()){
			printf("%05d %d ",*it,Node[*it].num);
		}else{
			printf("%05d\n%05d %d ",*it,*it,Node[*it].num);
		}
	}
	printf("-1\n");
	return 0;
}

不合并输出的写法:

#include<iostream>
#include<vector>
using namespace std;
struct node{
	int num;
	int next;
}Node[100005];
int root,N,K;
vector<int> v1,v2,v3;
void go(int index){
	if(index==-1) return;
	if(Node[index].num<0){
		v1.push_back(index);
	}else if(Node[index].num<=K){
		v2.push_back(index);
	}else{
		v3.push_back(index);
	}
	go(Node[index].next);
}
int main(){
	cin>>root>>N>>K;
	for(int i=0;i<N;i++){
		int index;
		scanf("%d",&index);
		scanf("%d %d",&Node[index].num,&Node[index].next);
	}
	go(root);
	for(auto it=v1.begin();it!=v1.end();it++){
		if(it==v1.begin()){
			printf("%05d %d ",*it,Node[*it].num);
		}else{
			printf("%05d\n%05d %d ",*it,*it,Node[*it].num);
		}
	}
	if(v1.size()!=0&&v2.size()!=0) printf("%05d\n",v2[0]);
	for(auto it=v2.begin();it!=v2.end();it++){
		if(it==v2.begin()){
			printf("%05d %d ",*it,Node[*it].num);
		}else{
			printf("%05d\n%05d %d ",*it,*it,Node[*it].num);
		}
	}
	if((v2.size()!=0||v1.size()!=0)&&v3.size()!=0) printf("%05d\n",v3[0]);
	for(auto it=v3.begin();it!=v3.end();it++){
		if(it==v3.begin()){
			printf("%05d %d ",*it,Node[*it].num);
		}else{
			printf("%05d\n%05d %d ",*it,*it,Node[*it].num);
		}
	}
	printf("-1\n");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值