POJ1785 Binary Search Heap Construction【笛卡尔树】

题意:构建一棵笛卡尔树,中序输出

思路:先按坐标排序,一个个插入。笛卡尔树原理和构造方法,这里忽略。留一下模板


#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<math.h>
#include<vector>
#include<list>
#include<map>
#include<stack>
#include<queue>
#include<algorithm>
#include<numeric>
#include<functional>
using namespace std;
typedef long long ll;
const int maxn = 5e4+5;

struct data
{
	int val;
	char s[105];
}no[maxn];

struct Node
{
	char s[105];
	int val;
	int l,r,fa;
}node[maxn];
int cnt;
int st[maxn],top;

int cmp(const data &x, const data &y)
{
	return strcmp(x.s,y.s) < 0;
}

void init()
{
	cnt = 1;
	top = -1;
}

int fu(int x)
{
	node[cnt].fa = 0;
	node[cnt].l = 0;
	node[cnt].r = 0;
	strcpy(node[cnt].s,no[x].s);
	node[cnt].val = no[x].val;
}

void add(int z)
{
	fu(z);
	if(top < 0) //第一个元素
	{
		st[++top] = cnt;
		cnt++;
		return;
	}
	while(top >= 0 && node[ st[top] ].val < node[cnt].val) //小的val出栈 
		top--;
	if(top >= 0) //把上一个节点的右子树,挂到cnt的左子树 
	{
		int x = st[top];
		int	y = node[x].r;
		node[cnt].l = y;
		node[y].fa = cnt; 	
		node[x].r = cnt;
		node[cnt].fa = x;
	}
	else //现在cnt的val最大,作为根
	{
		node[st[0]].fa = cnt;
		node[cnt].l = st[0];
	}
	st[++top] = cnt;
	cnt++;
} //l,r,fa 指向0,即没有点 

int pr(int x)
{
	putchar('(');
	if(node[x].l)
		pr(node[x].l);
	printf("%s/%d",node[x].s,node[x].val);
	if(node[x].r)
		pr(node[x].r);
	putchar(')');
}

int main(void)
{
	int n;
	while(scanf("%d",&n) && n)
	{
		init();
		for(int i = 1; i <= n; i++)			
			scanf(" %[a-z]/%d",no[i].s,&no[i].val);
		sort(no+1,no+1+n,cmp);
		for(int i = 1; i <= n; i++)
			add(i);
		pr(st[0]);
		putchar('\n');
	}
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值