两个相同高度的猫屋(cathouse)之间最矮的猫屋不能比它俩还高。
听了某个同学的思路,用二叉树的中序遍历输出就符合条件,这个二叉树一共最多二十层(题目的范围是1e5,20层二叉树的节点数大于1e5),每一层的节点上的值都是该节点所在的层数。
二叉树建树不太熟悉,有点忘了,不知道第二种建树方式哪里出错了,出现了段错误。
AC的代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6+10;
int pos,n,m,a[N];
vector<int>ans;
struct node
{
int data;
node *l,*r;
};
node *root;
node *build(node *root,int cnt)
{
if(cnt>m)
return NULL;
root = new node;
root->data = cnt;
cnt++;
root->l = build(root->l,cnt);
root->r = build(root->r,cnt);
return root;
}
void Find(node *root)
{
if(root!=NULL)
{
Find(root->l);
ans.push_back(root->data);
Find(root->r);
}
}
int main()
{
scanf("%d",&n);
for(int i=1; i<=20; i++)
{
a[i] = ((int)pow(2,i))-1;
}
for(int i=1; i<=20; i++)
{
if(a[i]>=n)
{
m = i;
break;
}
}
root = new node;
root = build(root,1);
Find(root);
for(int i=0; i<n; i++)
{
if(i==0)
printf("%d",ans[i]);
else
printf(" %d",ans[i]);
}
printf("\n");
return 0;
}