poj 北大oj 2201 Cartesian Tree

题意分析:

这道题考察的知识点就是数据结构的笛卡尔树,一下是我从网上找的有管笛卡尔树的一些介绍:

1.    笛卡尔树(key,value):在(解决范围搜索的集合)数据结构问题时提出的,从数列中构造一棵笛卡尔树可以线性时间完成。它具有堆的有序性,中序遍历可以输出原数列。

笛卡尔树的性质

1.    节点一一对应于数列元素

2.    中序遍历笛卡尔树即可得到原数列

3.    树结构存在堆序性质,即任意树节点所对应的数值大(或小)于其左右子树内任意结点对应数值。

这道题只是一道简单的笛卡尔树数据结构的入门题。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct px {
	int key,value;
	int id;
}s[50005];
int stack[50005],pre[50005],rson[50005],lson[50005];
int cmp(struct px a,struct px b) {
	return a.key < b.key;
}
int buildTree(int n) {
	int top=-1,k,i;
	for(i=0; i<n; i++) {
		k=top;
		while(k>=0&&s[stack[k]+1].value >s[i+1].value) --k;
		if(k>-1) {
			pre[s[i+1].id] = s[stack[k]+1].id;
			rson[s[stack[k]+1].id] = s[i+1].id;
		}
		if(k<top) {
			pre[s[stack[k+1]+1].id] = s[i+1].id;
			lson[s[i+1].id] = s[stack[k+1]+1].id;
		}
		stack[++k] = i;
		top = k;
	}
	pre[s[stack[0]+1].id]=0;
}
int main() {
	int n,i;
	cin>>n;
	for(i=1; i<=n; i++) {
		cin>>s[i].key>>s[i].value;
		s[i].id = i;
	}
	memset(rson,0,sizeof(rson));
	memset(lson,0,sizeof(lson));
	memset(pre,0,sizeof(pre));
	memset(stack,-1,sizeof(stack));
	sort(s+1,s+n+1,cmp);
	buildTree(n);
	printf("YES\n");
	for(i=1; i<=n; i++) cout<<pre[i]<<' '<<lson[i]<<' '<<rson[i]<<endl;
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值