题目描述
知识点: 二叉树,树的遍历
思路: 按照题目建树,判断根只要看有没有人指向它就可以判断,然后遍历即可。因为都对反转后的树进行前序和层次遍历。所以前序的时候直接先遍历右子树,然后根,然后左子树(相当于对镜像树进行先序)。层次就先判断右子树入队,然后左子树即可。
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
bool v[13];
int l[13],r[13];
int n;
bool is_first = true;
void in_order(int u){
if(u == -1) return;
in_order(r[u]);
if(is_first){
cout<<endl<<u;
is_first = false;
}else cout<<" "<<u;
in_order(l[u]);
}
void level_order(int u){
queue<int> q;
q.push(u);
while(!q.empty()){
int f = q.front();
q.pop();
if(is_first) {
cout<<f;
is_first = false;
}else cout<<" "<<f;
if(r[f] != -1) q.push(r[f]);
if(l[f] != -1) q.push(l[f]);
}
}
int main(){
scanf("%d",&n);
memset(l,-1,sizeof l);
memset(r,-1,sizeof r);
getchar();
for(int i = 0;i < n;i++){
char l_i,r_i;
scanf("%c %c",&l_i,&r_i);
getchar();
if(l_i != '-'){
l[i] = l_i - '0';
v[l_i - '0'] = true;
}
if(r_i != '-'){
r[i] = r_i - '0';
v[r_i - '0'] = true;
}
}
int root;
for(int i = 0;i < n;i++) if(v[i] == false) root = i;
level_order(root);
is_first = true;
in_order(root);
}