问题链接: https://pintia.cn/problem-sets/994805342720868352/problems/994805367987355648
题意:二叉树有N个结点,给出每个结点的左右孩子结点的编号,不存在用-1表示。接着给出一个N个整数的序列,需要把这N个整数填入二叉树的结点中,使得二叉树成为一棵二叉查找树。输出这棵二叉查找树的层序遍历序列。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct node{
int data;
int lchild;
int rchild;
}Node[100];
bool notgen[100] = {false};
int N;//树的结点个数
int in[100];
int num1 = 0, num2 = 0;
void inorder(int k){
if(k < 0 || k > N-1)
return;
inorder(Node[k].lchild);
Node[k].data = in[num1++];
inorder(Node[k].rchild);
}
void level(int k){
queue<int> Q;
Q.push(k);
while(!Q.empty()){
int p = Q.front();
Q.pop();
cout << Node[p].data;
num2++;
if(num2 < N)
cout << " ";
if(Node[p].lchild != -1)
Q.push(Node[p].lchild);
if(Node[p].rchild != -1)
Q.push(Node[p].rchild);
}
}
int main(){
cin >> N;
//输入下标关系,构建二叉树框架
for(int i = 0; i < N; i++){
cin >> Node[i].lchild >> Node[i].rchild;
if(Node[i].lchild != -1)
notgen[Node[i].lchild] = true;
if(Node[i].rchild != -1)
notgen[Node[i].rchild] = true;
}
//输入结点数值,并将结点权值从小到大排序,即为中序遍历序列
for(int i = 0; i < N; i++){
cin >> in[i];
}
sort(in, in + N);
int k;//找出根节点下标k
for(int i = 0; i < N; i++){
if(notgen[i] == false){
k = i;
break;
}
}
inorder(k);//中序遍历,并将结点对应权值输入
level(k);//层序遍历输出二叉排序树
return 0;
}