题目解法来自
(101条消息) PAT甲级1102 Invert a Binary Tree:[C++题解]反转二叉树、递归_阿正的梦工坊的博客-CSDN博客
分析: 翻转二叉树,翻转每个左右结点
1. 先交换,再遍历
void dfs_reverse(int u)
{
if(u == -1 ) return;
swap(l[u], r[u]);
dfs_reverse(l[u]);
dfs_reverse(r[u]);
}
2. 也可以先遍历, 再交换
void dfs_reverse(int u)
{
if(u == -1 ) return;
dfs_reverse(l[u]);
dfs_reverse(r[u]);
swap(l[u], r[u]);// 交换左右子树
}
AC代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 20;
int l[N], r[N], q[N];
int has_father[N]; //求其根节点
int n;
// 递归交换左右结点
void dfs_reverse(int u)
{
if(u == -1 ) return;
swap(l[u], r[u]);
dfs_reverse(l[u]);
dfs_reverse(r[u]);
}
//中序遍历
// k用来记录输出个数,防止末位空格
void indfs(int u, int &k)
{
if(u == -1 ) return;
indfs(l[u], k);
cout << u;
if( ++ k != n) cout << " " ;
indfs(r[u], k);
}
// 层次遍历
void bfs(int root)
{
int hh = 0, tt = 0;
q[0] = root;
while(hh <= tt)
{
int t = q[hh ++];
if(l[t] != -1) q[++ tt] = l[t];
if(r[t] != -1) q[++ tt] = r[t];
}
cout << q[0];
for(int i = 1; i < n; i ++ )
cout << " " << q[i];
}
// memset初始化,不是 "-" 读入 a-'0' 否则不变即为初始值 -1
// has_father 记录结点有无父节点,有就是1, 无就是0, 初始化为0, 即都无父节点,
int main()
{
memset(l, -1, sizeof l);
memset(r, -1, sizeof r);
memset(has_father, 0, sizeof has_father);
cin >> n;
for(int i = 0; i< n; i ++ )
{
char a, b;
cin >> a >> b;
if(a != '-') l[i] = a - '0', has_father[l[i]] = 1;
if(b != '-') r[i] = b - '0', has_father[r[i]] = 1;
}
int root = 0;
while(has_father[root] != 0) root ++;
dfs_reverse(root);
bfs(root);
cout << endl;
int k = 0;
indfs(root, k);
return 0;
}