题目大意
二叉搜索树 (BST) 递归地定义为具有以下属性的二叉树:
- 节点的左子树只包含键小于节点键的节点。
- 节点的右子树只包含键大于或等于节点键的节点。
- 左右子树也必须是二叉搜索树。
给定二叉树的结构和一系列不同的整数键,只有一种方法可以将这些键填充到树中,以便生成的树满足 BST 的定义。
您应该输出该树的层次遍历序列。
解决思路
- 首先根据输入我们开辟一个大小为num数组来存放节点
- 每一棵树的索引我们使用下标来找到(不是指针)
- 将给出的数组递增排序
- 首先利用递归先序遍历来进行初始化树(二叉搜索树的先序遍历就是一个递增的序列)
- 然后通过层次遍历输出
代码
#include<bits/stdc++.h>
using namespace std;
struct TreeNode
{
int val = 0;
int left = -1;
int right = -1;
};
int numNode;
vector<TreeNode*> treeNodevec;
vector<int> vec;
int ind = 0;
void previsitTree(TreeNode* root) {
if (root->left != -1)
previsitTree(treeNodevec[root->left]);
//visit:
root->val = vec[ind++];
if(root->right != -1)
previsitTree(treeNodevec[root->right]);
return;
}
void layerVisit(TreeNode* root) {
ind = 0;
//层次遍历
queue<TreeNode*> que;
que.push(root);
int size;
while (!que.empty()) {
size = que.size();
for (int i = 0; i < size; i++) {
TreeNode* tem = que.front();
que.pop();
vec[ind++] = tem->val;
if(tem->left != -1)
que.push(treeNodevec[tem->left]);
if (tem->right != -1)
que.push(treeNodevec[tem->right]);
}
}
return;
}
int main() {
cin >> numNode;
if (numNode <= 0) {
return 0;
}
treeNodevec.resize(numNode);
for (int i = 0; i < numNode; i++) {
treeNodevec[i] = new TreeNode();
}
for (int i = 0; i < numNode; i++) {
int le, ri;
cin >> le >> ri;
treeNodevec[i]->left = le;
treeNodevec[i]->right = ri;
}
for (int i = 0; i < numNode; i++) {
int x;
cin >> x;
vec.push_back(x);
}
sort(vec.begin(), vec.end());
//前序遍历二叉树
previsitTree(treeNodevec[0]);
//输出层次遍历序列即可
layerVisit(treeNodevec[0]);
for (int i = 0; i < ind; i++) {
if (i == 0)
cout << vec[i];
else
cout << ' ' << vec[i];
}
return 0;
}