【天梯赛练习】L2-035 完全二叉树的层序遍历
- 后序遍历转层序遍历
- 后序遍历:左——右——根
- 层序遍历:数组形式存储的完全二叉树的顺序遍历序列其实就正好是其层序遍历序列。
- 子树根若是 i d id id,左子树 i d ∗ 2 id*2 id∗2,右子树 2 ∗ i d + 1 2*id+1 2∗id+1
所以就是dfs递归找左右子树
注意后序遍历特点,最后才输出根。所以dfs中找完左右子树才记录根。
#include <bits/stdc++.h>
#define forr(i,l,r) for(int i=l;i<=r;i++)
#define reforr(i,l,r) for(int i=r;i>=l;i--)
#define int long long
#define pii pair<int,int>
#define endl '\n'
#define PI 3.14159265
using namespace std;
const int N=35;
int pst[N];
int d,n;
int res[N],cnt=0;
void dfs(int id){if(id>n)return;dfs(id<<1);//左子树dfs(id<<1|1);//右子树res[id]=pst[++cnt];//先到的是最左边的子树// cout<<id<<' '<<cnt<<' '<<res[id]<<endl;
}
void solve(){cin>>n;forr(i,1,n){cin>>pst[i];}dfs(1);forr(i,1,n){cout<<res[i]<<(i==n?'\n':' ');}
}