一、技术总结
- 这一题题目的理解上给出了每个结点的左右子树的情况,然后就是把这个二叉树反转后进行层次序列和中序遍历进行输出。
- 如何对于该二叉树进行反序,就是在后序遍历后,进行左右子树的交换,使用swap函数。
- 还有就是对于换行符的接收,可以单独用一个getchar(),也可以进行使用%*c,接收,具体参考代码。
二、参考代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 110;
struct node{
int lchild, rchild;
}Node[maxn];
bool notRoot[maxn] = {false};//记录是否为根结点,初始均为根结点
int n, num = 0;//n为结点个数,num为当前已输出的结点个数
//print函数输出结点的id编号
void print(int id){
printf("%d", id);
num++;
if(num < n) printf(" ");//最后一个不输出空格
else printf("
");
}
void inOrder(int root){
if(root == -1){
return;
}
inOrder(Node[root].lchild);
print(root);
inOrder(Node[root].rchild);
}
void BFS(int root){
queue<int> q;
q.push(root);
while(!q.empty()){
int now = q.front();
q.pop();
print(now);
if(Node[now].lchild != -1) q.push(Node[now].lchild);
if(Node[now].rchild != -1) q.push(Node[now].rchild);
}
}
//后序遍历用于反转二叉树
void postOrder(int root){
if(root == -1){
return;
}
postOrder(Node[root].lchild);
postOrder(Node[root].rchild);
swap(Node[root].lchild, Node[root].rchild);
}
//将输入的字符转换为-1或者结点的编号
int strToNum(char c){
if(c == '-') return -1;//表示没有孩子结点,标记为-1
else{
notRoot[c - '0'] = true;//标记c不是根结点
return c - '0';//返回根结点编号
}
}
//寻找根结点编号
int findRoot(){
for(int i = 0; i < n; i++){
if(notRoot[i] == false){
return i;
}
}
}
int main(){
char lchild, rchild;
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%*c%c %c", &lchild, &rchild);
Node[i].lchild = strToNum(lchild);
Node[i].rchild = strToNum(rchild);
}
int root = findRoot();
postOrder(root);
BFS(root);
num = 0;
inOrder(root);
return 0;
}