题目描述如下
https://www.patest.cn/contests/pat-a-practise/1099
题目重点
1.明白可以用结构体建树,结构体需要包括left,right,value
2.明白二叉搜索树的中序遍历就是数组从小到大遍历
3.层次遍历,手动模拟发现,需要时队列
代码如下:
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
struct node{//表示节点的结构体,左节点,右节点,值
int left,right,value;
};
node mynode[101];
int i=0;
void inOrder(int p,int num[]){//递归进行中序遍历 ,建立二叉搜索树
if(mynode[p].left!=-1){// 左
inOrder(mynode[p].left,num);
}
mynode[p].value = num[i++];//中
if(mynode[p].right!=-1){//右
inOrder(mynode[p].right,num);
}
}
int main(int argc, char *argv[]) {
int n;
cin>>n;
for(int i=0;i<n;i++){//建立树结构
int left,right;
cin>>left>>right;
mynode[i].left = left;
mynode[i].right = right;
}
int num[n];
for(int i=0;i<n;i++){
cin>>num[i];
}
sort(num,num+n);//排序
inOrder(0,num);//建立树
//层次遍历
queue<int> q;
q.push(0);
vector<int> res;
while(!q.empty()){
res.push_back(mynode[q.front()].value);//取出头子节点的value值
int top = q.front();//树节点
q.pop();//对头出对
if(mynode[top].left!=-1){//左子树进队列
q.push(mynode[top].left);
}
if(mynode[top].right!=-1){//右子树进队列
q.push(mynode[top].right);
}
}
//输出不带空格
cout<<res[0];
for(int i=1;i<res.size();i++){
cout<<" "<<res[i];
}
return 0;
}