PAT A1102 Invert a Binary Tree
思路:设置标志数组notRoot,将作为左右子结点都排除为根节点,可找到根节点。接着根据后序遍历的顺序来Invert整颗树,利用BFS进行层序遍历。
#include<cstdio>
#include<queue>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn = 15;
typedef struct {
int left, right;
} Node;
Node node[maxn];
bool notRoot[maxn];
int n, num;
int ToNumber(char ch) {
if(ch == '-') return -1;
notRoot[ch - '0'] = true;
return ch - '0';
}
int findRoot() {
for(int i = 0; i < n; i++)
if(!notRoot[i]) return i;
return -1;
}
void invertTree(int root) {
if(root == -1) return;
invertTree(node[root].left);
invertTree(node[root].right);
swap(node[root].left, node[root].right);
}
void levelOrder(int root) {
queue<int> q;
q.push(root);
while(!q.empty()) {
int temp = q.front();
q.pop();
printf("%d", temp);
num++;
if(num < n) printf(" ");
if(node[temp].left != -1) q.push(node[temp].left);
if(node[temp].right != -1) q.push(node[temp].right);
}
num = 0;
printf("\n");
}
void inOrder(int root) {
if(root == -1) return;
inOrder(node[root].left);
printf("%d", root);
num++;
if(num < n) printf(" ");
inOrder(node[root].right);
}
int main() {
cin >> n;
char left, right;
for(int i = 0; i < n; i++) {
cin >> left >> right;
node[i].left = ToNumber(left);
node[i].right = ToNumber(right);
}
int root = findRoot();
invertTree(root);
levelOrder(root);
inOrder(root);
return 0;
}