剑指OFFER之二叉树的镜像(九度OJ1521)
题目描述:
-
输入一个二叉树,输出其镜像。

- 输入:
-
输入可能包含多个测试样例,输入以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)的更多相关文章
- 《剑指offer》 二叉树的镜像
本题来自<剑指offer>二叉树的镜像 题目: 操作给定的二叉树,将其变换为源二叉树的镜像. 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 ...
- 力扣 - 剑指 Offer 27. 二叉树的镜像
题目 剑指 Offer 27. 二叉树的镜像 思路1(递归) 我们可以使用深度优先搜索,先递归到链表的末尾,然后从末尾开始两两交换.就相当于后续遍历而已 记得要先保存下来node.right节点,因为 ...
- 【剑指Offer】二叉树的镜像 解题报告(Python)
[剑指Offer]二叉树的镜像 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...
- 【Java】 剑指offer(27) 二叉树的镜像
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请完成一个函数,输入一个二叉树,该函数输出它的镜像. 思路 画图可 ...
- Go语言实现:【剑指offer】二叉树的镜像
该题目来源于牛客网<剑指offer>专题. 操作给定的二叉树,将其变换为源二叉树的镜像. 示例: 输入: 4 / 2 7 / \ / 1 3 6 9 输出: 4 / 7 2 / \ / 9 ...
- 【剑指offer】二叉树的镜像
转载请注明出处:http://blog.csdn.net/ns_code/article/details/25915971 题目描写叙述: 输入一个二叉树,输出其镜像. 输入: 输入可能包括多个測试例 ...
- 剑指Offer 18. 二叉树的镜像 (二叉树)
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...
- 剑指offer:二叉树的镜像
题目描述: 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / ...
- 【剑指offer】二叉树的镜像,C++实现(先序遍历)
原创博文,转载请注明出处!github地址 博客文章索引地址 1.题目 输入一颗二叉树,将二叉树变换为原二叉树的镜像,如下图所示: 2.思路 二叉树有0个节点 二叉树有1个节点 二叉树有 ...
- [剑指Offer] 18.二叉树的镜像
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5 [思路1 ...
随机推荐
- Spring mvc接受集合类型参数的方法
public String xxxxx(String xxxx, String xxxxx, @RequestParam("parameterList[]") List<St ...
- jQuery 给div绑定单击事件
说明:这篇随笔介绍的是怎么给div添加单击(click)事件.不再废话 直接看代码 <%@ Page Language="C#" AutoEventWireup=" ...
- (t,p,o) t:p>=o there cannot be more consumer instances in a consumer group than partitions
https://kafka.apache.org/intro.html Kafka as a Messaging System How does Kafka's notion of streams c ...
- ImageIO 操作图片
/** * 读取本地图片到另一个本地文件夹 * @throws IOException */ public void copeImageToOtherFolder() throws IOExcepti ...
- 向HTML页面传入参数
这次是想将参数传入HTML页面,通过js获取参数信息,动态生成HTML页面内容: 方法一: <script> function GetArgsFromHref(sHref, sArgNam ...
- SystemV和BSD的区别
目前,Unix操作系统不管其内核如何,其操作风格上主要分为SystemV(目前一般采用其第4个版本SVR4)和BSD两种.其代表操作系统本别是Solaris和FreeBSD.当然,在SunOS4(So ...
- ffmpeg xcode 中的使用
最近比较闲,苦于ios设备上没有直接播放torrent 文件的软件,开始折腾了.找了不少资料有了思路.但是其中用到了ffmpeg 这个东西. ffmpeg 是通用的一个视频解决框架,用C语言编写,通用 ...
- BZOJ 1617 [Usaco2008 Mar]River Crossing渡河问题:dp
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1617 题意: Farmer John以及他的N(1 <= N <= 2,500 ...
- poj 2420 A Star not a Tree? —— 模拟退火
题目:http://poj.org/problem?id=2420 给出 n 个点的坐标,求费马点: 上模拟退火. 代码如下: #include<iostream> #include< ...
- kafka之二:Kafka 设计与原理详解
一.Kafka简介 本文综合了我之前写的kafka相关文章,可作为一个全面了解学习kafka的培训学习资料. 转载请注明出处 : 本文链接 1.1 背景历史 当今社会各种应用系统诸如商业.社交.搜索. ...