题目
2022年天梯赛决赛的前一晚,来几道二叉树的题目(RP++)
给你一个完美二叉树的前N项的后序遍历,求它的层序遍历
我的思考
我的思路是根据每个点往下有多少个子结点,因为给我的最后一个肯定是根,然后递归往下找。
我用一个我自己的样例,就是上图的10个
10
91 83 71 14 2 34 10 15 55 18
这个18肯定是根,前一个肯定是它的右结点,但是每一个数的前一个不一定是右结点,因为有可能不存在,所以我们判断一下:
inline void dfs(int x,int p)
{
if (p<=0||x>n) return;
tree[x].v=a[p];
if (tree[2*x+1].cnt) dfs(x*2+1,p-1);//如果右边还需要有数目,那就传
dfs(x*2,p-1-tree[x*2+1].cnt);//不然传左边
}
统计的这个cnt就比较好统计,直接往下传就好,大于n的话就return,最后像线段树那样在加起来即可
因为是二叉树,只需要for循环输出就好
for (int i=1;i<=n;i++) cout<<tree[i].v<<" ";
总代码:
struct node
{
int l,r,cnt=0,v;
node(){}
}tree[110];
inline void count(int x)
{
tree[x].cnt=1;
if (x*2<=n) count(x*2);
if (x*2+1<=n) count(x*2+1);
tree[x].cnt+=tree[x*2].cnt+tree[x*2+1].cnt;
}
inline void dfs(int x,int p)
{
if (p<=0||x>n) return;
tree[x].v=a[p];
if (tree[2*x+1].cnt) dfs(x*2+1,p-1);
dfs(x*2,p-1-tree[x*2+1].cnt);
}
inline void Case_Test()
{
cin>>n;
for (int i=1;i<=n;i++)
{
cin>>a[i];
to[i]=a[i];
}
int p=n;
count(1);
dfs(1,p);
for (int i=1;i<=n;i++) cout<<tree[i].v<<" ";
}
最简单正解
void build(int x){
if(x>n) {
return ;
}
build(2*x);//左
build(2*x+1);//右
//根,后续遍历
cin>>level[x];//递归完毕再读入
}
int main() {
cin>>n;
build(1);
rep(i,1,n){
cout<<level[i];
if(i<n) cout<<" ";
}
return 0;
}
文章评论