1064. Complete Binary Search Tree (30)
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:
- The left subtree of a node contains only nodes with keys less than the node's key.
- The right subtree of a node contains only nodes with keys greater than or equal to the node's key.
- Both the left and right subtrees must also be binary search trees.
A Complete Binary Tree (CBT) is a tree that is completely filled, with the possible exception of the bottom level, which is filled from left to right.
Now given a sequence of distinct non-negative integer keys, a unique BST can be constructed if it is required that the tree must also be a CBT. You are supposed to output the level order traversal sequence of this BST.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (<=1000). Then N distinct non-negative integer keys are given in the next line. All the numbers in a line are separated by a space and are no greater than 2000.
Output Specification:
For each test case, print in one line the level order traversal sequence of the corresponding complete binary search tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.
Sample Input:10 1 2 3 4 5 6 7 8 9 0Sample Output:
6 3 8 1 5 7 9 0 2 4
https://www.patest.cn/contests/pat-a-practise/1064
https://www.nowcoder.com/pat/5/problem/4115
思路:
升序序列就是CBT的中序遍历序列
转化成已知满二叉树的中序遍历序列,求其层序遍历序列
由此进行递归处理
CODE:
#include<iostream>
#include<algorithm>
#include<cstdio>
#define N 1010
typedef struct S
{
int v;
int f;
};
S no[N];
using namespace std;
bool cmp1(S a,S b){return a.v<b.v;}
bool cmp2(S a,S b){return (a.f==b.f)?(a.v<b.v):(a.f<b.f);}
void dfs(int l,int r,int fl)
{
if (l==r)
{
no[l].f=fl;
return;
}
int i=1;
int sum=1;
while (sum<(r-l+1))
{
i*=2;
sum+=i;
}
sum-=i;
i/=2;
int now;
if (r-l+1>sum+i)
now=l+sum/2+i;
else
now=l+sum/2+(r-l+1-sum);
no[now].f=fl;
if (now>l)dfs(l,now-1,fl+1);
if (now<r)dfs(now+1,r,fl+1);
}
int main()
{
int n;
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&no[i].v);
sort(no+1,no+n+1,cmp1);
dfs(1,n,0);
sort(no+1,no+n+1,cmp2);
for (int i=1;i<n;i++) cout<<no[i].v<<" ";
cout<<no[n].v;
return 0;
}