剑指Offer - 九度1521 - 二叉树的镜像
2013-11-30 23:32
-
输入:
-
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号)。接下来一行有n个数字,代表第i个二叉树节点的元素的值。接下来有n行,每行有一个字母Ci。
Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号。
Ci=’l’表示第i个节点有一个左孩子,紧接着是左孩子的编号。
Ci=’r’表示第i个节点有一个右孩子,紧接着是右孩子的编号。
Ci=’z’表示第i个节点没有子孩子。
-
输出:
-
对应每个测试案例,
按照前序输出其孩子节点的元素值。
若为空输出NULL。
-
样例输入:
-
7 8 6 10 5 7 9 11 d 2 3 d 4 5 d 6 7 z z z z
-
样例输出:
-
8 10 11 9 6 7 5
题意分析:
给定两棵二叉树,输出它的镜像,即左右节点正好相反,上图给的例子已经很清楚了。方法很明确,递归求解即可,对于每个节点,将左右节点交换,然后向下递归。每个点都会访问到一次,所以时间复杂度O(n)。空间复杂度O(1),只有交换过程中myswap使用了额外变量。
注意:根节点是哪一个,题目并没指定,所以要根据入度来判断哪个才是根,根节点入度为0。
1 // 652479 zhuli19901106 1521 Accepted 点击此处查看所有case的执行结果 1036KB 2022B 0MS 2 // 201311170020 3 #include <cstdio> 4 using namespace std; 5 6 const int MAXN = 1005; 7 int a[MAXN][4]; 8 int n; 9 int r; 10 bool first_node; 11 12 void myswap(int &a, int &b) 13 { 14 a ^= b ^= a ^= b; 15 } 16 17 void mirror(int a[][4], int ra) 18 { 19 if(a == NULL){ 20 return; 21 } 22 23 if(ra < 0 || ra > n - 1){ 24 return; 25 } 26 27 if(a[ra][1] != -1){ 28 mirror(a, a[ra][1]); 29 } 30 if(a[ra][2] != -1){ 31 mirror(a, a[ra][2]); 32 } 33 myswap(a[ra][1], a[ra][2]); 34 } 35 36 void preorder(const int a[][4], int ra) 37 { 38 if(a == NULL){ 39 return; 40 } 41 42 if(ra < 0 || ra > n - 1){ 43 return; 44 } 45 46 if(first_node){ 47 printf("%d", a[ra][0]); 48 first_node = false; 49 }else{ 50 printf(" %d", a[ra][0]); 51 } 52 if(a[ra][1] != -1){ 53 preorder(a, a[ra][1]); 54 } 55 if(a[ra][2] != -1){ 56 preorder(a, a[ra][2]); 57 } 58 } 59 60 int main() 61 { 62 int i; 63 char s[10]; 64 int x, y; 65 66 while(scanf("%d", &n) == 1){ 67 if(n <= 0){ 68 printf("NULL\n"); 69 continue; 70 } 71 for(i = 0; i < n; ++i){ 72 a[i][0] = a[i][1] = a[i][2] = -1; 73 a[i][3] = 0; 74 } 75 for(i = 0; i < n; ++i){ 76 scanf("%d", &a[i][0]); 77 } 78 for(i = 0; i < n; ++i){ 79 scanf("%s", s); 80 if(s[0] == 'd'){ 81 scanf("%d%d", &x, &y); 82 a[i][1] = x - 1; 83 a[i][2] = y - 1; 84 ++a[x - 1][3]; 85 ++a[y - 1][3]; 86 }else if(s[0] == 'l'){ 87 scanf("%d", &x); 88 a[i][1] = x - 1; 89 ++a[x - 1][3]; 90 }else if(s[0] == 'r'){ 91 scanf("%d", &y); 92 a[i][2] = y - 1; 93 ++a[y - 1][3]; 94 } 95 } 96 r = -1; 97 for(i = 0; i < n; ++i){ 98 if(a[i][3] == 0){ 99 if(r == -1){ 100 r = i; 101 }else{ 102 r = -1; 103 break; 104 } 105 } 106 } 107 if(r < 0){ 108 // invalid tree structure 109 printf("NULL\n"); 110 continue; 111 } 112 mirror(a, r); 113 first_node = true; 114 preorder(a, r); 115 printf("\n"); 116 } 117 118 return 0; 119 }