剑指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 }

 

 posted on 2013-11-30 23:38  zhuli19901106  阅读(240)  评论(0编辑  收藏  举报