A1102 Invert a Binary Tree (25分)
一、技术总结
- 这一题题目的理解上给出了每个结点的左右子树的情况,然后就是把这个二叉树反转后进行层次序列和中序遍历进行输出。
- 如何对于该二叉树进行反序,就是在后序遍历后,进行左右子树的交换,使用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("\n");
}
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;
}
作者:睿晞
身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
曾有一个业界大牛说过这样一段话,送给大家:
“华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.