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("\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;
}
posted @ 2020-02-16 16:51  睿晞  阅读(130)  评论(0编辑  收藏  举报