好的,我AC了,我比Max Howell强(狗头)
在建树的时候就翻转建立,就将两个指针域反过来就可以了,然后就按照正常顺序遍历即可,Max Howell就这?(狗头保命!!!!!!!滑稽)
# include <bits/stdc++.h>
using namespace std;
int N;
int cnt;
struct Node{
int l, r;
}node[10];
void levelOrder(int root){
queue<int> Q;
Q.push(root);
int now = Q.front();
while(!Q.empty()){
now = Q.front();
Q.pop();
cout << now;
++cnt == N ? cout<<"\n" : cout<<" ";
if(node[now].l != -1) Q.push(node[now].l);
if(node[now].r != -1) Q.push(node[now].r);
}
}
void inOrder(int root){
if(root == -1) return;
inOrder(node[root].l);
cout << root;
++cnt == N ? cout<<"\n" : cout<<" ";
inOrder(node[root].r);
}
int main(){
scanf("%d\n", &N); // 输入树结点数量
bool isChild[10] = {0}; // 记录
for(int i = 0;i < N;++i){
char left, right;
scanf("%c %c\n", &left, &right);
// 翻转指针域,建的树就直接是翻转二叉树。
node[i].r = left == '-' ? -1 : left -'0'; // 因为编号最多是个位数,所以可以直接减
node[i].l = right == '-' ? -1 : right-'0';
// 记录谁是别人的孩子,然后剩下的那一个不是别人的孩子的就是根节点
if(node[i].l != -1) isChild[node[i].l] = true;
if(node[i].r != -1) isChild[node[i].r] = true;
}
int R;
for(int i = 0;i < N;++i){
if(isChild[i] == false){
R = i;
}
}
cnt = 0;
levelOrder(R);
cnt = 0;
inOrder(R);
return 0;
}
不在建树时翻转,而是正常建树后用后序遍历翻转二叉树(用先序遍历也可以,只是每一次的翻转后不符合先序遍历的定义而已,但是在效果上没问题)
# include <bits/stdc++.h>
using namespace std;
int N;
int cnt;
struct Node{
int l, r;
}node[10];
void levelOrder(int root){
queue<int> Q;
Q.push(root);
int now = Q.front();
while(!Q.empty()){
now = Q.front();
Q.pop();
cout << now;
++cnt == N ? cout<<"\n" : cout<<" ";
if(node[now].l != -1) Q.push(node[now].l);
if(node[now].r != -1) Q.push(node[now].r);
}
}
void inOrder(int root){
if(root == -1) return;
inOrder(node[root].l);
cout << root;
++cnt == N ? cout<<"\n" : cout<<" ";
inOrder(node[root].r);
}
void postorder(int root){ // 后序遍历翻转树
if(root == -1) return;
postorder(node[root].l);
postorder(node[root].r);
swap(node[root].l, node[root].r);
}
int main(){
scanf("%d\n", &N); // 输入树结点数量
bool isChild[10] = {0}; // 记录
for(int i = 0;i < N;++i){
char left, right;
scanf("%c %c\n", &left, &right);
node[i].l = left == '-' ? -1 : left-'0'; // 因为编号最多是个位数,所以可以直接减
node[i].r = right == '-' ? -1 : right-'0';
// 记录谁是别人的孩子,然后剩下的哪一个不是别人的孩子的就是根节点
if(node[i].l != -1) isChild[node[i].l] = true;
if(node[i].r != -1) isChild[node[i].r] = true;
}
int R;
for(int i = 0;i < N;++i){
if(isChild[i] == false){
R = i;
}
}
postorder(R);
cnt = 0;
levelOrder(R);
cnt = 0;
inOrder(R);
return 0;
}