作者 高天
单位 临沂大学
满二叉树是一种特殊的二叉树,它的每一层都是满的,也就是说每个节点都有两个子节点(除了最后一层)。设满二叉树的深度为d,则它总共有2d−1个节点
现在给你一棵满二叉树的中序遍历,求出其层序遍历,按树形输出。
输入格式:
输入的第一行给出一个整数d——表示树的深度。
输入的第二行给出2d−1个整数——表示节点的编号。
1≤d≤10
输出格式:
输出共d行,表示该满二叉树的结构以及节点编号位置。
输入样例:
3
1 6 4 3 5 2 7
输出样例:
3
6 2
1 4 5 7
思路:
因为是中序排序,所以一直找中间的点输出就行。
方法:
用bfs跑完整棵树。
AC代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define endl "\n" const ll N = 2e3+7; ll n,m; ll v[N]; bool vis[N]; queue<pair<ll,ll>>q;//存左边界和右边界 void bfs(){ ll f=0,k=q.size(); for(ll i = 0 ; i < k ; i ++){ ll x=q.front().first,y=q.front().second; q.pop(); ll mid=x+y >> 1;//找中点 vis[mid]=1;//标记此点已经来过 f ++ ? cout << " " << v[mid] : cout << v[mid];//输出 if(!vis[x+mid >> 1])q.push({x,mid});//往左查找 if(!vis[mid+y+1 >> 1])q.push({mid+1,y});//往右查找 } cout << endl; if(!q.empty())bfs(); } void solve(){ cin >> n; m=1<<n; for(ll i = 1 ; i < m ; i ++)cin >> v[i]; q.push({1,m-1});//初始左边界是1,右边界是m-1 bfs(); return; } int main(){ ll t=1;//cin >> t; while(t --)solve(); return 0; }