这道题感觉挺有意思的,考查了二叉树的层序遍历和中序遍历。
数据量太小了,真的只是模板题。
需要注意的地方:
1.标记空结点
2.交换左右子树后层序遍历和中序遍历
3.找树根
版本2
#include<cstdio>
#include<vector>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
vector<int> child[15],level,in;
void levelorder(int root){
queue<int> q;
q.push(root);
while(!q.empty()){
int tmp = q.front();
q.pop();
level.push_back(tmp);
for(int i=1;i>=0;i--){
if(child[tmp][i] != -1) q.push(child[tmp][i]);
}
}
}
void inorder(int root){
if(root == -1) return;
inorder(child[root][1]);
in.push_back(root);
inorder(child[root][0]);
}
int start[15];
int main(){
int n;
char left,right;
memset(start,-1,sizeof(start));
scanf("%d",&n);
for(int i=0;i<n;i++){
getchar();
scanf("%c %c",&left,&right);
if(left >='0' && left <= 10 +'0'){
child[i].push_back(left-'0');
start[left-'0']=i;
}else{
child[i].push_back(-1);
start[left-'0']=i;
}
if(right >='0' && right <= 10 + '0'){
child[i].push_back(right - '0');
start[right-'0']=i;
}else{
child[i].push_back(-1);
start[right-'0']=i;
}
}
int root=0;
for(int i=0;i<n;i++){
if(start[i]==-1){
root = i;
break;
}
}
//printf("%d\n",root);
levelorder(root);
inorder(root);
for(int i=0;i<level.size();i++){
if(i>0) printf(" ");
printf("%d",level[i]);
}
putchar(10);
for(int i=0;i<in.size();i++){
if(i>0) printf(" ");
printf("%d",in[i]);
}
return 0;
}
版本1
#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
#include <string>
#include <queue>
#include <unordered_map>
#include <algorithm>
using namespace std;
const int N = 12;
vector<int> level, invert;
int G[N][2];
int in[N];
int n;
void inorder(int root){
if(G[root][1] != -1) inorder(G[root][1]);
invert.push_back(root);
if(G[root][0] != -1) inorder(G[root][0]);
}
void levelorder(int root){
queue<int> q;
q.push(root);
while(q.size()){
auto t = q.front();
q.pop();
level.push_back(t);
if(G[t][1] != -1) q.push(G[t][1]);
if(G[t][0] != -1) q.push(G[t][0]);
}
}
int main(){
int u;
scanf("%d", &n);
string left, right;
for(int i = 0; i < n; i++){
cin>>left>>right;
if(left[0] !='-') {
u = stoi(left);
G[i][0] = u;
in[u]++;
}else G[i][0] = -1;
if(right[0] !='-') {
u = stoi(right);
G[i][1] = u;
in[u]++;
}else G[i][1] = -1;
}
int root;
for(int i = 0; i < n; i++) if(!in[i]) root = i;
levelorder(root);
inorder(root);
//输出层序
for(int i = 0; i < level.size(); i++){
printf("%d", level[i]);
if(i!= level.size()-1) printf(" ");
else printf("\n");
}
//输出翻转中序
for(int i = 0; i < invert.size(); i++){
printf("%d", invert[i]);
if(i!= invert.size()-1) printf(" ");
else printf("\n");
}
return 0;
}