题目描述:

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

输入:

输入可能包含多个测试样例,输入以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. iOS开发工具篇-AppStore统计工具

    本文转载至 http://mobile.51cto.com/hot-418183.htm 随着iOS开发的流行,针对iOS开发涉及的方方面面,早有一些公司提供了专门的解决方案或工具.这些解决方案或工具 ...

  2. (转) 实现wince datagrid 上下滑屏数据浏览

    开发 基于wince 手持设备数据库应用时 由于是触摸屏 当datagrid 数据过多 往往用户烦于去控制又窄又细的上下滚动条 尤其是高分辨率的屏上 (如魅族M8系统 720×480) 而且datag ...

  3. 海康DS NVR播放URL规则

    URL规定:rtsp://username:password@<address>:<port>/Streaming/Channels/<id>(?parm1=val ...

  4. java集合类学习心得

    java集合类学习心得 看了java从入门到精通的第十章,做个总结,图片均取自网络. 常用集合的继承关系 Linked 改快读慢 Array 读快改慢 Hash 两都之间 Collection是集合接 ...

  5. 拜托,面试请不要再问我TCC分布式事务的实现原理!(转)

    一.写在前面 之前网上看到很多写分布式事务的文章,不过大多都是将分布式事务各种技术方案简单介绍一下.很多朋友看了不少文章,还是不知道分布式事务到底怎么回事,在项目里到底如何使用. 所以咱们这篇文章,就 ...

  6. 最简单的Windows程序

    准备研究一下vmp 保护,从一个最简单的Windows程序入手似乎是个不错的想法. 如何才最简单呢,仅仅有一个MessageBox 调用好了. 弹出消息.退出,哦也,够简单吧. 祭出法器VC2010. ...

  7. bapi_goodsmvt_create-GR

    BAPI_GOODSMVT_CREATE 使用方法 * GMCODE Table T158G - - MB01 - Goods Receipts for Purchase Order * - MB31 ...

  8. java中的break与continue

    1.两者的作用 break:是跳出当前的循环块或者程序块.循环块有for.do while.while,程序块有switch(){case 1: xxx;break;}在循环体中的作用是跳出正在循环的 ...

  9. UVA12293 Box Game —— SG博弈

    题目链接:https://vjudge.net/problem/UVA-12293 题意: 两人玩游戏,有两个盒子,开始时第一个盒子装了n个球, 第二个盒子装了一个球.每次操作都将刷量少的盒子的球倒掉 ...

  10. Gym - 100187A A - Potion of Immortality —— 贪心

    题目链接:http://codeforces.com/gym/100187/problem/A 题解: 光题意就想了很久:在最坏情况下的最小兔子数.其实就是至少用几只兔子就一定能找出仙药(答案存在的话 ...