A1102 Invert a Binary Tree (25分)

一、技术总结

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