转载请注明出处: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. 分布式消息系统jafka快速起步(转)

    Jafka 是一个开源的/性能良好的分布式消息系统.在上一篇文章中有所简单介绍.下面是一篇简单的入门文档.更多详细的文档参考wiki. Step 1: 下载最新的安装包 完整的安装指南在这里.最新的发 ...

  2. hdu1937 Finding Seats

    hdu1937 Finding Seats 题意是 求最小的矩形覆盖面积内包含 k 个 空位置 枚举上下边界然后 双端队列 求 最小面积 #include <iostream> #incl ...

  3. uva 10127 - Ones(数论)

    题目链接:uva 10127 - Ones 题目大意:给出n,问说者少要多少为1才干够整除n. 解题思路:等于是高精度取模,直到余数为0为止. #include <cstdio> #inc ...

  4. Javascript 正确用法 二

    好的,废话不多说,接着上篇来. 变量(variables) 始终使用 var keyword来定义变量,假设不这样将会导致 变量全局化,造成污染. //bad superPower = new Sup ...

  5. Java学习——何为JNDI

    曾记得在做机房收费系统的时候就接触到了API,由于它的功能非常强大,可是自己对它却不怎么了解.所以当时是又爱又怕.现在,一路走来才明确,事实上它就是一组接口.仅仅要我们去了解它就会发现.它事实上也没想 ...

  6. 【linux】UBUNTU 12.04下傻瓜式简单安装arm-linux-gcc等gnu arm toolchain交叉编译工具

    欢迎转载,转载时请保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...

  7. BaseActivity--上门啦

    package com.fwpt.activity; import com.fwpt.entity.RyUserInfo; import com.fwpt.entity.SmlaUserinfo; i ...

  8. tmux centos 6.3

    tmux-1.6-1.el6.rf.i686.rpm CentOS 6 / RHEL 6 Download #21 tmux-1.6-1.el6.rf.i686.rpm

  9. python学习——截图工具编写

    学习一门语言最好的方法便是实践,想要拿Python写一个截图工具,网上一搜资料果然已经很多,前辈们都已经做的很到位了.现在就一步步来学习一下: 首先学习截图整个桌面的方法,可以使用Python中的PI ...

  10. CSDN头版头条 《近匠》 Wijmo 5 CTO:从Web到移动,我的25年编程生涯

    现年52岁的Bernardo Castilho先生是GrapeCity(中文名为葡萄城)ComponentOne公司的CTO,在与他的对话过程中.充满风趣严谨和厚重的历史感. 当作为年轻人的我们崇拜着 ...