Cartesian Tree

PAT-1167

  • 一开始我使用数组进行存储,但是这样可能会导致无法开足够大的数组,因为树如果是链表状的则无法开这么大的数组(虽然结点很少)。
  • 正确的解法还是需要建树,使用指针。
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<sstream>
#include<set>
#include<map>
#include<cmath>
#include<vector>
#include<unordered_map>
#include<queue>
using namespace std;
const int INF=0X3F3F3F3F;
int n;
const int maxn=1003;
int a[maxn];//中序遍历
int tree[8*maxn];
int buildHeap(int root,int inl,int inr){
if(inl>inr)
return -1;
int mid=INF;
int midi=0;
for(int i=inl;i<=inr;i++){
if(a[i]<mid){
mid=a[i];
midi=i;
}
}
tree[root<<1]=buildHeap(root<<1,inl,midi-1);
tree[root<<1|1]=buildHeap(root<<1|1,midi+1,inr);
return mid;
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
tree[1]=buildHeap(1,0,n-1);
queue<int>que;
que.push(1);
vector<int>ve;
while(!que.empty()){
int root=que.front();
que.pop();
ve.push_back(tree[root]);
int lroot=root<<1;
int rroot=root<<1|1;
if(tree[lroot]!=-1){
que.push(lroot);
}
if(tree[rroot]!=-1){
que.push(rroot);
}
}
for(int i=0;i<ve.size();i++){
if(i==(int)ve.size()-1){
cout<<ve[i]<<endl;
}else{
cout<<ve[i]<<" ";
}
}
return 0;
}
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<sstream>
#include<set>
#include<map>
#include<cmath>
#include<vector>
#include<unordered_map>
#include<queue>
using namespace std;
const int INF=0X3F3F3F3F;
int n;
const int maxn=1003;
int a[maxn];//中序遍历
int tree[8*maxn];
struct Node{
int data;
Node* left;
Node* right;
};
Node* buildHeap(int inl,int inr){
if(inl>inr)
return NULL;
int mid=INF;
int midi=0;
for(int i=inl;i<=inr;i++){
if(a[i]<mid){
mid=a[i];
midi=i;
}
}
Node* now=new Node();
now->data=mid;
now->left=buildHeap(inl,midi-1);
now->right=buildHeap(midi+1,inr);
return now;
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
// cout<<"ue"<<endl;
Node* root=buildHeap(0,n-1);
queue<Node*>que;
que.push(root);
vector<int>ve;
while(!que.empty()){
Node* now=que.front();
que.pop();
ve.push_back(now->data);
if(now->left!=NULL){
que.push(now->left);
}
if(now->right!=NULL){
que.push(now->right);
}
}
for(int i=0;i<ve.size();i++){
if(i==(int)ve.size()-1){
cout<<ve[i]<<endl;
}else{
cout<<ve[i]<<" ";
}
}
return 0;
}

最新文章

  1. 用soapUI生成客户端代码
  2. [LeetCode] Range Sum Query - Immutable &amp; Range Sum Query 2D - Immutable
  3. www.97top10.com--做最好的技术交流网站
  4. Android linearlayout常用布局
  5. Windows Phone 8.1 列表控件(1):基本
  6. 帝国cms内容页模版
  7. 多线程进阶之并发工具类:CountDownLatch、CyclicBarrier
  8. php 运算符and or &amp;&amp; || 的详解
  9. C#之winform实现文件拖拽功能
  10. 【Unity Shaders】Shader中的光照
  11. nginx 配置文件的结构
  12. Linux 的基本操作(系统的安装)
  13. 检测三种不同操作系统的Bash脚本
  14. 用原型封装一个操作DOM的例子
  15. SQL Server 笔记
  16. 如何在 Windows 10 中搭建 Node.js 环境?
  17. Android ListView 几个重要属性
  18. [转]从客户端中检测到有潜在危险的Request.Form值的详细解决
  19. 缓存-MemoryCache Class
  20. My latest news(--2016.12.31)

热门文章

  1. hdu3905 Sleeping (区间dp)
  2. python对csv文件读写的两种方式 和 读写文件编码问题处理
  3. Educational Codeforces Round 88 (Rated for Div. 2) D、Yet Another Yet Another Task
  4. Codeforces ECR86 C. Yet Another Counting Problem(规律,区间)
  5. Tomacat目录以及服务器配置文件信息
  6. Typora Themes自定义
  7. C# LINQ (2)
  8. Leetcode(3)-无重复字符的最长子串
  9. List遍历以及剔除指定数据
  10. In_array()函数弱比较