PAT(甲级)2019年冬季考试 7-4 Cartesian Tree

Posted CSU迦叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT(甲级)2019年冬季考试 7-4 Cartesian Tree相关的知识,希望对你有一定的参考价值。

这道题利用的是最小堆和中序排序的属性:只要知道根节点,就能得出哪些属于左子树,哪些属于右子树。

开始我一直报段错误,经过筛查,发现是创建树的函数忘记写返回语句 return root.

AC代码

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<map>
#include<cstring>

using namespace std;

const int maxn = 100;

const int SUP = 2000000000;

struct Node{
	int data;
	Node* lchild;
	Node* rchild;
};

int n,A[100];

int getMin(int l,int r){
	int min = SUP;
	for(int i=l;i<=r;i++){
		if(A[i]<min)min = A[i];
	}
	return min;
}

Node* create(int l,int r){
	if(l>r)return NULL;
	
	Node* root = new Node;
	root->data = getMin(l,r);
	
	int k;
	for(k=l;k<=r;k++){
		if(A[k] == root->data)break;
	}
	
	root->lchild = create(l,k-1);
	root->rchild = create(k+1,r);
	
	return root;
}

int hasp = 0; 
void BFS(Node* root){
	queue<Node*> Q;
	Q.push(root);
	
	while(!Q.empty()){
		Node* top = Q.front();
		Q.pop();
		printf("%d",top->data);
		hasp ++;
		if(hasp<n)printf(" ");
		if(top->lchild!=NULL)Q.push(top->lchild);
		if(top->rchild!=NULL)Q.push(top->rchild);
	}
}

int main(){
	
	scanf("%d",&n);
	
	for(int i=0;i<n;i++){
		scanf("%d",&A[i]);
	}
	
	Node* root = create(0,n-1);
	
	BFS(root);
	
	return 0;
}

结果

 

以上是关于PAT(甲级)2019年冬季考试 7-4 Cartesian Tree的主要内容,如果未能解决你的问题,请参考以下文章

PAT(甲级)2019年冬季考试 7-2 Block Reversing

PAT(甲级)2018年冬季考试

PAT甲级2019冬季考试题解

PAT2021年冬季考试甲级,摸鱼游记92分

PAT2021年冬季考试甲级,摸鱼游记92分

PAT(甲级)2018年冬季考试 7-2 Decode Registration Card of PAT