题目描述:

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

输入:

输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号)。接下来一行有n个数字,代表第i个二叉树节点的元素的值。接下来有n行,每行有一个字母Ci。
Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号。
Ci=’l’表示第i个节点有一个左孩子,紧接着是左孩子的编号。
Ci=’r’表示第i个节点有一个右孩子,紧接着是右孩子的编号。
Ci=’z’表示第i个节点没有子孩子。

输出:

对应每个测试案例,
按照前序输出其孩子节点的元素值。
若为空输出NULL。

样例输入:

d
d
d
z
z
z
z
样例输出:
      

解题思路:

  通常的思路,我们创建一个树以后,交换没个节点的左右孩子就行了。

  但是对于这道题,还有个思路,我们创建自己的数据结构,使得数据存储在一个数组中,这个数组的元素是一个树的节点,这样就省去了再创建树的过程。

#define MAX 1000

typedef struct treeElement{
int flag;//用于判断数组中有没有元素,有元素的数组元素被初始化为1
int num;
int lchild;//左孩子的下标值
int rchild;
}TreeElement;
typedef struct treeArr{
TreeElement tree[MAX];
}TreeArr;

  在数据结构使用前,记得要进行初始化

for(i=;i<MAX;i++){
t->tree[i].flag =;
t->tree[i].num = ;
t->tree[i].lchild = ;
t->tree[i].rchild = ;
}

  然后,对于一个树,如果正常前序遍历,是它自己的树。而如果按照中右左的顺序扫描树,得到的就是它的镜像的前序遍历了。这样即节省了空间,又节省了交换的时间。

代码:

 #include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define MAX 1000
int nullTree = ;
typedef struct treeElement{
int flag;
int num;
int lchild;
int rchild;
}TreeElement;
typedef struct treeArr{
TreeElement tree[MAX];
}TreeArr; void printfTree(TreeArr *t);
void printNode(TreeArr *t,TreeElement *te);
int main(){
TreeArr *t = (TreeArr *)malloc(sizeof(TreeArr));
int n;
char c;
while(scanf("%d",&n)!=EOF && n>= && n<=){
nullTree = ;
int i,n1,n2;
if(n != )
nullTree = ;
for(i=;i<MAX;i++){
t->tree[i].flag =;
t->tree[i].num = ;
t->tree[i].lchild = ;
t->tree[i].rchild = ;
} for(i=;i<=n;i++){
scanf("%d",&t->tree[i].num);
t->tree[i].flag = ;
t->tree[i].lchild = ;
t->tree[i].rchild = ;
}
for(i=;i<=n;i++){
scanf("\n%c",&c);
if(c == 'd'){
scanf("%d %d",&n1,&n2);
t->tree[i].lchild = n1;
t->tree[i].rchild = n2;
getchar();
}
if(c == 'l'){
scanf("%d",&n1);
t->tree[i].lchild = n1;
getchar();
}
if(c == 'r'){
scanf("%d",&n1);
t->tree[i].rchild = n1;
getchar();
}
if(c == 'z'){
getchar();
}
}
printfTree(t);
printf("\n");
}
return ;
}
void printfTree(TreeArr *t){
if(nullTree)
printNode(t,&t->tree[]);
else
printf("NULL");
}
void printNode(TreeArr *t,TreeElement *te){
if(!te->flag)
return;
else{
if(te->num == t->tree[].num)
printf("%d",te->num);
else
printf(" %d",te->num);
if(te->rchild)
printNode(t,&t->tree[te->rchild]);
if(te->lchild)
printNode(t,&t->tree[te->lchild]);
return ;
}
}
/**************************************************************
Problem: 1521
User: xhalo
Language: C
Result: Accepted
Time:0 ms
Memory:916 kb
****************************************************************/

剑指OFFER之二叉树的镜像(九度OJ1521)的更多相关文章

  1. 《剑指offer》 二叉树的镜像

    本题来自<剑指offer>二叉树的镜像 题目: 操作给定的二叉树,将其变换为源二叉树的镜像. 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 ...

  2. 力扣 - 剑指 Offer 27. 二叉树的镜像

    题目 剑指 Offer 27. 二叉树的镜像 思路1(递归) 我们可以使用深度优先搜索,先递归到链表的末尾,然后从末尾开始两两交换.就相当于后续遍历而已 记得要先保存下来node.right节点,因为 ...

  3. 【剑指Offer】二叉树的镜像 解题报告(Python)

    [剑指Offer]二叉树的镜像 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...

  4. 【Java】 剑指offer(27) 二叉树的镜像

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请完成一个函数,输入一个二叉树,该函数输出它的镜像. 思路 画图可 ...

  5. Go语言实现:【剑指offer】二叉树的镜像

    该题目来源于牛客网<剑指offer>专题. 操作给定的二叉树,将其变换为源二叉树的镜像. 示例: 输入: 4 / 2 7 / \ / 1 3 6 9 输出: 4 / 7 2 / \ / 9 ...

  6. 【剑指offer】二叉树的镜像

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25915971 题目描写叙述: 输入一个二叉树,输出其镜像. 输入: 输入可能包括多个測试例 ...

  7. 剑指Offer 18. 二叉树的镜像 (二叉树)

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

  8. 剑指offer:二叉树的镜像

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

  9. 【剑指offer】二叉树的镜像,C++实现(先序遍历)

    原创博文,转载请注明出处!github地址  博客文章索引地址 1.题目       输入一颗二叉树,将二叉树变换为原二叉树的镜像,如下图所示: 2.思路 二叉树有0个节点 二叉树有1个节点 二叉树有 ...

  10. [剑指Offer] 18.二叉树的镜像

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

随机推荐

  1. c# 编程修改 wince 系统时间

    [StructLayout(LayoutKind.Sequential)] public struct SYSTEMTIME { public ushort wYear; public ushort ...

  2. spring 集成 mybatis 后数据源初始化失败问题分析

    问题背景: 项目使用spring,springmvc框架,后边需操作关系数据库,选择了mybatis + durid,集成mybatis后,项目一直启动失败.错误的原因是dataSource初始化的时 ...

  3. 挂断电话demo

    <!-- 结束通话和打电话的权限 --> <uses-permission android:name="android.permission.CALL_PHONE" ...

  4. [NOIP2011提高组day2]-3-观光公交

    3.观光公交 (bus.cpp/c/pas) [问题描述] 风景迷人的小城 Y 市,拥有 n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光 ...

  5. Codeforces Round #364 (Div. 1)(vp) 没什么题解就留坑待填

    我就做了前两题,第一题第一次vp就把我搞自闭跑路了,第二题第二次又把我搞自闭了 A. As Fast As Possible 细节题 #include<cstdio> #include&l ...

  6. UVA1025 A Spy in the Metro —— DP

    题目链接: https://vjudge.net/problem/UVA-1025 题解: 详情请看紫书P267. 与其说是DP题,我觉得更像是模拟题,特别是用记忆化搜索写. 递推: #include ...

  7. LR添加Windows和Linux压力机实战

    添加Windows和Linux压力机实战 既然Controller是LoadRunner的“心脏”,那么压力产生也必然是它发起的,通过压力机来对被测系统产生压力.一般压力机分为Windows和Linu ...

  8. ffmpeg入门基础知识

    获取ffmpeg源代码 如果你是在Windows环境下,则可以先装SVN的一个客户端TortoiseSVN(非常好用,强烈推荐),他安装完成后会集成在右键菜单中,点Checkout菜单,在弹出的界面中 ...

  9. 英语发音规则---s发/s/的读音规则

    英语发音规则---s发/s/的读音规则 一.总结 一句话总结:字母s的读音有/s/./z/./ʃ/./{/这几种,下面主要讲讲发/s/音的几条规则. 字母s的读音有/s/./z/./ʃ/./{/这几种 ...

  10. Win8风格的WPF按钮

    Win8将Windows的风格又进行了一次变革,我还挺喜欢的,有简洁大气的感觉,华丽绚丽的东西看多了之后总会返璞归真寻找简洁大气的感觉才能心情舒畅. 下面就给个WPF下Button的自定义写法.   ...