原题目: 1099 Build A Binary Search Tree (30 分).
题意
给出一棵二叉搜索树每个结点的左右孩子,根结点ID为0,要求插入数值,
👉输出层序遍历序列。
分析
- 关键: BST的中序遍历序列是非递减序列,而题目又单独给出BST的数据序列,故不需要真的建树——① 将数据序列递增排列(这就与中序序列一一对应了);② 用DFS从根结点开始中序遍历,就可以依次给每个结点赋予相应的数据,以及完全二叉树规则的下标和层次。
- 中序转层序——根据下标和层次进行排序,即可得到层序序列。
CODE
#include <iostream>
#include <algorithm>
using namespace std;
int n, cnt = 0;
int b[100]; //存储数据
struct node{
int data;
int lchild, rchild;
int index; //按完全二叉树存放在数组中
int layer;
}a[110];
bool cmp(node a, node b){ //按层序排序
if ( a.layer!=b.layer ) return a.layer<b.layer;
return a.index<b.index;
}
void DFS(int root, int index, int layer);
int main()
{
cin >> n;
for ( int i=0; i<n; i++ )
cin >> a[i].lchild >> a[i].rchild;
for ( int i=0; i<n; i++ )
cin >> b[i];
//构建BST
sort(b, b+n); //BST的层序序列满足非递减序列
DFS(0, 1, 1); //按BST赋予值,按完全二叉树赋予下标和层次
sort(a, a+n, cmp); //转成层序序列
for ( int i=0; i<n; i++ ){
if ( i!=0 ) cout << " ";
cout << a[i].data;
}
return 0;
}
void DFS(int root, int index, int layer){
if ( a[root].lchild==-1 && a[root].rchild==-1 )
a[root] = {b[cnt++], a[root].lchild, a[root].rchild, index, layer};
else{
if ( a[root].lchild!=-1 )
DFS(a[root].lchild, 2*index, layer+1);
a[root] = {b[cnt++], a[root].lchild, a[root].rchild, index, layer};
if ( a[root].rchild!=-1 )
DFS(a[root].rchild, 2*index+1, layer+1);
}
}