疑问
暂无
代码
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 110;
struct node{
int data;
int rchild;
int lchild;
}Node[maxn];
//输入节点的数量
int n;
//输入的数据
int input[maxn];
//当前访问坐标
int index=0;
void inOrder(int root){
if(root==-1){
return;
}else{
inOrder(Node[root].lchild);
Node[root].data = input[index++];
inOrder(Node[root].rchild);
}
}
void layerOrder(){
queue<int> q;
int root = 0;
q.push(root);
index = 0;
while(!q.empty()){
int cur = q.front();
q.pop();
printf("%d%c",Node[cur].data,index!=n-1?' ':NULL);
index++;
if(Node[cur].lchild!=-1){
q.push(Node[cur].lchild);
}
if(Node[cur].rchild!=-1){
q.push(Node[cur].rchild);
}
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d %d",&Node[i].lchild,&Node[i].rchild);
}
for(int i=0;i<n;i++){
scanf("%d",&input[i]);
}
sort(input,input+n);
inOrder(0);
layerOrder();
return 0;
}
反思
暂无
二刷代码
其实可以一边层序遍历,一边输出结果的。。。我现在都很难想到这一点了;
//使用静态二叉树
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 110;
struct node{
int data;
int left;
int right;
}tree[maxn];
int n;
int data[maxn];
int layer[maxn];
int idx=0;
int cnt=0;
void inOrder(int root){
if(root == -1){
return;
}else{
inOrder(tree[root].left);
tree[root].data = data[cnt];
cnt++;
inOrder(tree[root].right);
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
int l,r;
scanf("%d %d",&l,&r);
tree[i].left = l;
tree[i].right = r;
}
for(int i=0;i<n;i++){
scanf("%d",&data[i]);
}
sort(data,data+n);
//然后进行中序遍历
inOrder(0);
//开始层序遍历
queue<int> q;
q.push(0);
while(!q.empty()){
int cur = q.front();
q.pop();
layer[idx++] = tree[cur].data;
if(tree[cur].left!=-1){
q.push(tree[cur].left);
}
if(tree[cur].right!=-1){
q.push(tree[cur].right);
}
}
for(int i=0;i<idx;i++){
printf("%d%c",layer[i],i==idx-1?NULL:' ');
}
return 0;
}