题目大意:给定一组数据要求我们用这些数据构建一个具有完全二叉树性质的二叉搜索树,并将这个树按层次遍历打印。
先建一个节点个数为N的完全二叉树,然后中序遍历这棵树并赋值。
二叉搜索树特性:中序遍历为这组数据从小到大升序。所以我们在中序遍历这棵完全二叉树的时候按访问先后为这些节点从小到大赋值,这个树就能具有二叉搜索树的性质了。
类型题还有1099binary search tree
代码:
#include<iostream>
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
typedef struct tree{
int val;
struct tree *left ,*right;
}tree;
vector<int>num;
int flag = 0;
void value(tree *root) {
if (root) {
value(root->left);
root->val = num[flag++];
value(root->right);
}
}
int main() {
int n,i;
cin>>n;
num.resize(n);
for (i = 0;i < n;i++) {
cin>>num[i];
}
sort(num.begin(),num.end());
tree inorder[n+1];
for (i = 1;i <= n/2;i++) {
inorder[i].left = &inorder[i*2];
if (i*2+1 <= n) {
inorder[i].right = &inorder[i*2+1];
}
else {
inorder[i].right = NULL;
}
}
for (i = n/2+1;i <= n;i++) {
inorder[i].left = NULL;
inorder[i].right = NULL;
}
value(inorder+1);
tree *BFS[n];
int front = -1,rear = 1;
BFS[++front] = inorder+1;
while (front != rear) {
if (BFS[front]) {
if (BFS[front]->left) {
BFS[rear++] = BFS[front]->left;
}
if (BFS[front]->right) {
BFS[rear++] = BFS[front]->right;
}
}
if (front != 0) {
cout<<" ";
}
cout<<BFS[front++]->val;
}
return 0;
}
看过陈越姥姥的数据结构后我自己重写了一遍
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<vector>
using namespace std;
vector<int>CBST;
vector<int>a;
int search(int n) {
int num = n,level = 0;
while(num) {
num /= 2;
level++;
}
level--;
int x= n - pow(2,level) + 1;
int leftnum = pow(2,level-1) - 1 + (x > pow(2,level-1)?pow(2,level-1):x);
//fprintf(stderr,"%d\n",leftnum);
return leftnum;
}
int insert(int start,int n,int flag) {
if (n == 0) {
return 0;
}
int num = search(n);//当前CBST根节点左子树的节点数
CBST[flag] = a[num+start];
insert(start,num,flag*2);
insert(start+num+1,n-num-1,flag*2+1);
}
int main() {
int n,i;//完全二叉搜索树节点个数
cin>>n;
CBST.resize(n+1);
a.resize(n);
for (i = 0;i < n;i++) {
cin>>a[i];
}
sort(a.begin(),a.end());
insert(0,n,1);
for (i = 1;i <= n;i++) {
cout<<CBST[i]<<" ";
}
return 0;
}