【题意】
对于一个给出结构的BST,将给定的数字填入其中并输出层先遍历序列
【思路】
BST的中序遍历是非递减的,利用这一点即可用一次中序遍历把数字填上。层先遍历用队列实现
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
using namespace std;
struct BiNode{
int index;
int val;
BiNode *left;
BiNode *right;
BiNode(int i) :index(i), val(0), left(nullptr), right(nullptr){}
};
map<int, BiNode*> nodes;
void insertLeft(BiNode *root, int index){
if (nodes.find(index) == nodes.end()){
nodes[index] = new BiNode(index);
}
root->left = nodes[index];
}
void insertRight(BiNode *root, int index){
if (nodes.find(index) == nodes.end()){
nodes[index] = new BiNode(index);
}
root->right = nodes[index];
}
int index = 0;
void inSortAndMark(vector<int> &values, BiNode *cur){
if (cur == nullptr){
return;
}
inSortAndMark(values, cur->left);
cur->val = values[index++];
inSortAndMark(values, cur->right);
}
int main(){
int n;
cin >> n;
for (int i = 0; i < n; ++i){
int leftIndex, rightIndex;
cin >> leftIndex >> rightIndex;
if (nodes.find(i) == nodes.end()){
nodes[i] = new BiNode(i);
}
if (leftIndex != -1){
insertLeft(nodes[i], leftIndex);
}
if (rightIndex != -1){
insertRight(nodes[i], rightIndex);
}
}
vector<int> values(n);
for (int i = 0; i < n; ++i){
cin >> values[i];
}
sort(values.begin(), values.end());
inSortAndMark(values, nodes[0]);
queue<BiNode*> qq;
qq.push(nodes[0]);
bool first = 1;
while (!qq.empty()){
BiNode *tmp = qq.front();
qq.pop();
if (first){
first = 0;
}
else{
cout << " ";
}
cout << tmp->val;
if (tmp->left != nullptr){
qq.push(tmp->left);
}
if (tmp->right != nullptr){
qq.push(tmp->right);
}
}
system("pause");
return 0;
}