zoukankan      html  css  js  c++  java
  • 剑指Offer

    剑指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
    ");
     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
    ");
    110             continue;
    111         }
    112         mirror(a, r);
    113         first_node = true;
    114         preorder(a, r);
    115         printf("
    ");
    116     }
    117     
    118     return 0;
    119 }
  • 相关阅读:
    dubbo踩坑
    windows下面使用protobuf
    解决端口占用的问题
    建设检验
    统计学资料整理
    java cpu 负载高分析
    演讲/汇报
    管理和领导
    css渐变动画
    vue组件之间互相传值:父传子,子传父
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3451939.html
Copyright © 2011-2022 走看看