1. 程式人生 > >洛谷 P2171 Hz吐泡泡

洛谷 P2171 Hz吐泡泡

格式 lan pan 整數 -a oot dfs blank span

P2171 Hz吐泡泡

題目背景

Hz大大是一種可愛的動物(神)。他很喜歡吐泡泡(更喜歡寫作業)。

題目描述

這天,Hz大大心血來潮,吐了n個不同的泡泡玩(保證沒有重復的泡泡)。因為他還要寫作業,所以他請你幫他把這些泡泡排序成樹(左子樹<=根<右子樹)。輸出它的後序遍歷。

輸入輸出格式

輸入格式:

共2行。

第一行,1個整數n。(1<=n<=300000)

第二行,n個數,代表泡泡的大小。

輸出格式:

共2行。

第一行,輸出樹的深度。

第二行,輸出數的後序遍歷。

詳見樣例輸出。

輸入輸出樣例

輸入樣例#1: 復制
8
1 4 3 9 10 35 2 7
輸出樣例#1: 復制
deep=5
2
3
7
35
10
9
4
1

說明

水題一道。

思路:模擬堆

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
int n,cnt,deep,bns,root;
struct data{
    int ls,rs,val;
}tr[300007];
int max(int a,int
b){ if(a<b) return b; else return a; } void insert(int& rt,int x){ ++bns; if(!rt){ rt=++cnt;tr[rt].val=x;deep=max(deep,bns);return; } if(x>tr[rt].val) insert(tr[rt].rs,x); else insert(tr[rt].ls,x); return; } void dfs(int rt){ if(tr[rt].ls) dfs(tr[rt].ls);
if(tr[rt].rs) dfs(tr[rt].rs); printf("%d\n",tr[rt].val); } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ bns=0;int x; scanf("%d",&x); insert(root,x); } printf("deep=%d\n",deep); dfs(root); }

洛谷 P2171 Hz吐泡泡