转载请注明出处:http://blog.csdn.net/ns_code/article/details/25915971

题目描写叙述:

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

输入:

输入可能包括多个測试例子,输入以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

这道题目与上道题目一样,採用数组来作为保存二叉树节点的数据结构,会使測试代码更easy编写。详细的实现算法在代码中比較easy看懂,不细说了,主要想说下,測试时遇到的一些问题(最后AC了):

    1、先序遍历的输出要符合要求的格式,即对于每一个測试用例来说,输出的各节点元素间要有一个空格,且输出最后一个元素后要没有空格,但要输出一个换行符,这就要推断出程序什么时候遍历输出最后一个元素,再递归实现的先序遍历函数中,我没想到能使最后一个元素符合输出格式的方法,因此我这里定义了一个int数组,用来顺序保存先序遍历的节点的data,这样直接遍历输出该int数组就可以,并再循环输出中推断要输出的元素是不是最后一个输出元素,假设是,就加上换行符。

2、由于要输入字符,因此要考虑输入缓冲队列的问题,每行含有字符的数据输入后,会留下换行符,这样会在下次输入字符时被读取,造成读取字符的错误,因此在下一行数据開始输入前,要刷新缓冲区,刚開始图方面,用了fflush(stdin),在VC++上測试通过了,可是在九度OJ上报了RE,仅仅有一组測试用例通过,多次測试了几组数据之后,怀疑应该是fflush(stdin)的错误,由于有印象在C primer plus上说过,这不是C语言标准里的东西,想gcc应该不支持,后来在网上查了下,gcc是不支持的,这是微软在自家编译器里加的,因此果断用while--getchar()来取代,替换后果然AC了,哎!还是水啊,想想离校招还有不到4个月,心里就没底!

    AC代码:
#include<stdio.h>
#include<stdlib.h> typedef struct BTNode
{
int data;
int rchild;
int lchild;
}BTNode; /*
推断pTree1是否包括pTree2
*/
void MirrorTree(BTNode *pTree,int index)
{
if(pTree == NULL)
return;
if(index == -1)
return;
if(pTree[index].lchild==-1 && pTree[index].rchild==-1)
return; int temp = pTree[index].lchild;
pTree[index].lchild = pTree[index].rchild;
pTree[index].rchild = temp; if(pTree[index].lchild!=-1)
MirrorTree(pTree,pTree[index].lchild);
if(pTree[index].rchild!=-1)
MirrorTree(pTree,pTree[index].rchild);
} //这里设置全局变量i的目的是为了将先序遍历到的元素依次保存到数组preTraverse中,
//其目的是为了确定最后一个输出元素,这样好调整输出的格式,使输出符合測试系统的要求。
int i = 0;
void pre_traverse(BTNode *pTree,int index,int *preTraverse,int n)
{
if(pTree == NULL)
return;
if(index != -1 && i<n)
{
preTraverse[i++] = pTree[index].data;
if(pTree[index].lchild != -1)
pre_traverse(pTree,pTree[index].lchild,preTraverse,n);
if(pTree[index].rchild != -1)
pre_traverse(pTree,pTree[index].rchild,preTraverse,n);
}
} int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
//输入树pTree各节点的值
BTNode *pTree = NULL;
if(n>0)
{
pTree = (BTNode *)malloc(n*sizeof(BTNode));
if(pTree == NULL)
exit(EXIT_FAILURE);
int i,data;
//输入n个节点的data
for(i=0;i<n;i++)
{
scanf("%d",&data);
pTree[i].data = data;
pTree[i].rchild = -1;
pTree[i].lchild = -1;
} //输入n行节点连接关系
for(i=0;i<n;i++)
{
char ci;
//这两行的作用是为了跳过缓冲区中的换行符
//这里不能用fflush(stdin),gcc不支持,这仅仅是一些编译器自加的,
//假设用了,測试系统会报RE。
while(getchar() != '\n')
continue;
scanf("%c",&ci);
if(ci == 'z')
continue;
else if(ci == 'l')
{
int lindex;
scanf("%d",&lindex);
pTree[i].lchild = lindex-1;
}
else if(ci == 'r')
{
int rindex;
scanf("%d",&rindex);
pTree[i].rchild = rindex-1;
}
else if(ci == 'd')
{
int lindex,rindex;
scanf("%d",&lindex);
scanf("%d",&rindex);
pTree[i].lchild = lindex-1;
pTree[i].rchild = rindex-1;
}
}
} if(n == 0)
{
printf("NULL\n");
continue;
}
MirrorTree(pTree,0);
//先将遍历的元素依次保存到preTraverse数组中
int *preTraverse = (int *)malloc(n*sizeof(int));
if(preTraverse == NULL)
exit(EXIT_FAILURE);
pre_traverse(pTree,0,preTraverse,n);
int i;
for(i=0;i<n;i++)
{
//是输出符合測试系统要求的格式
if(i == n-1)
printf("%d\n",preTraverse[i]);
else
printf("%d ",preTraverse[i]);
} free(preTraverse);
preTraverse = NULL; free(pTree);
pTree = NULL;
}
return 0;
}
/**************************************************************
    Problem: 1521
    User: mmc_maodun
    Language: C
    Result: Accepted
    Time:0 ms
    Memory:916 kb
****************************************************************/

写点小插曲:今天AC了这道题后,顺道去科技楼看了下电影《年少轻狂》的拍摄,剧组进驻学校拍摄已经有一周多了,偶尔会在校园的某个地方碰到一些戏份的拍摄,这些天的晚上一直在科技楼前拍南海大学(剧中虚拟的大学)毕业舞会的镜头,虽说实验室就在科技楼,但晚上在图书馆自习,所以一直没去看过,今晚突发奇想,跑去瞄了两眼,听周围人说,前面领舞的女的就是陈妍希,我怎么看都看不出来,楼底下更是停了各种豪车:保时捷跑车、宾利老爷车。。。。尼玛演员、导演就是有钱,我等屌丝敲十几年代码都敲不出一辆宾利来,人家一部戏下来,神马都有了!

过来瞄几眼,就把我今天的跑步给耽误了,那是别人的舞台,与我无关,回去继续写程序。。。。。。

【剑指offer】二叉树的镜像的更多相关文章

  1. 剑指offer——二叉树的镜像

    题目:操作给定的二叉树,将其变换为源二叉树的镜像. 思路:前序(根左右的顺序)遍历一棵树,在存储的时候将其左右树进行交换,最后按照处理后的树还原,即得到其镜像. /** public class Tr ...

  2. 剑指Offer 二叉树的镜像

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...

  3. 用js刷剑指offer(二叉树的镜像)

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...

  4. 剑指Offer——二叉树

    剑指Offer--二叉树 前言 数据结构通常是编程面试中考察的重点.在参加面试之前,应聘者需要熟练掌握链表.树.栈.队列和哈希表等数据结构,以及它们的操作.本片博文主要讲解二叉树操作的相关知识,主要包 ...

  5. JS数据结构与算法 - 剑指offer二叉树算法题汇总

    ❗❗ 必看经验 在博主刷题期间,基本上是碰到一道二叉树就不会碰到一道就不会,有时候一个下午都在搞一道题,看别人解题思路就算能看懂,自己写就呵呵了.一气之下不刷了,改而先去把二叉树的基础算法给搞搞懂,然 ...

  6. 剑指offer 二叉树中和为某一个值的路径

    剑指offer 牛客网 二叉树中和为某一个值的路径 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 15:53:58 2 ...

  7. 剑指offer 二叉树的层序遍历

    剑指offer 牛客网 二叉树的层序遍历 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 09:33:16 2019 @ ...

  8. 剑指offer--25.二叉树的镜像

    时间限制:1秒 空间限制:32768K 热度指数:238655 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 ...

  9. 剑指Offer-18.二叉树的镜像(C++/Java)

    题目: 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ ...

  10. 剑指Offer 二叉树中和为某一值的路径(dfs)

    题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.     思路: 递归,然后深搜,因为题目定义的, ...

随机推荐

  1. 使用ACE获取主机的IP地址

    使用ACE获取主机的IP地址,不知道为什么会有127.0.0.1? #include "stdafx.h" #include "ace\OS.h" #inclu ...

  2. PHP - 验证用户名

    /** * * 函数名:_check_username($user_str,$min_num,$max_num); * 作用:检测用户名是否符合格式 * 参数: * 1:用户名 * 2:不得小于多少位 ...

  3. 如何使用springmvc的@requestbody 返回json数据

    先配置 XXX_ servletxml <!-- 整合jackson 返回一个json格式 --><bean class="org.springframework.web. ...

  4. POI读入excel文件到Java中

    package Poi_Test; //导入java自带的包 import java.io.BufferedInputStream; import java.io.File; import java. ...

  5. Swift - 产生不重复数字的随机数生成器

    在Swift中,可以使用函数类型的参数,也可以使用函数类型的返回值.而作为返回值的函数,还能“捕获”外部的值,并多次使用它.这个特性,常可用来创建各种生成器. 下面通过创建一个“随机数生成器函数”作为 ...

  6. [hadoop系列]Pig的安装和简单演示样例

    inkfish原创,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish ).(来源:http://blog.csdn.net/inkfish) Pig是Yaho ...

  7. 搭建Go开发及调试环境(LiteIDE + GoClipse)

    搭建Go开发及调试环境(LiteIDE + GoClipse) -- Windows篇 这里以Windows7 64位为例,如果是32位环境需安装对应版本程序. 一.安装golang1.2.2 1.3 ...

  8. 实现长按删除QListWidget的Item

    原地址:http://blog.sina.com.cn/s/blog_5c70dfc80100r99u.html 要想长按删除QListWidget的Item,必须重写鼠标事件,所以需要继承QList ...

  9. 施用 maven shade plugin 解决 jar 或类的多版本冲突

    施用 maven shade plugin 解决 jar 或类的多版本冲突   使用 maven shade plugin 解决 jar 或类的多版本冲突java 应用经常会碰到的依赖的三方库出现版本 ...

  10. hdu4707 Pet

    Pet Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...