剑指Offer - 九度1521 - 二叉树的镜像

剑指Offer - 九度1521 - 二叉树的镜像
2013-11-30 23:32
题目描述:

输入一个二叉树,输出其镜像。

剑指Offer - 九度1521 - 二叉树的镜像

输入:

输入可能包含多个测试样例,输入以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 }

 

你可能感兴趣的:(二叉树)