pat1064 Complete Binary Search Tree (30)——递归

来源:互联网 发布:2016 fc2视频最新域名 编辑:程序博客网 时间:2024/06/06 13:12

思路:先将数组排序,每次计算每个二叉点的左孩子点数,并维护好[left,right] 区间。

#include<iostream>#include<stdlib.h>using namespace std;const int maxn =1005;int n,a[maxn],ans[maxn];int cmp(const void *a,const void *b){return *(int *)a-*(int *)b;}int get_son(int root){if(root>n) return 0;if(root*2>n) return 1; // 叶节点int s=1;s+=get_son(root*2);s+=get_son(root*2+1);return s;//返回左孩子个数}void dfs(int root,int l,int r) //求得每个二叉树点的相应位置的值{if(root>n) return ;int left_son=get_son(root*2);ans[root]=l+get_son(root*2);dfs(root*2,l,ans[root]-1);dfs(root*2+1,ans[root]+1,r);}void solve(){qsort(a,n,sizeof(a[0]),cmp);dfs(1,0,n-1);for(int i=1;i<n;i++){printf("%d ",a[ans[i]]);}printf("%d\n",a[ans[n]]);}int main(){scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i]);}solve();return 0;}