剑指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 ...
随机推荐
- Windows消息、绘图与多线程
有一个项目,一旦点下按钮后,用死循环不停的读数据,读出后立刻用可视化的方法显示.如果不采用多线程的方法,程序运行都正确,但无法关闭窗口,不清楚是窗口无法通过关闭按钮来接受Windows消息,还是接受了 ...
- Cocos2d-x如何添加新场景及切换新场景(包括场景特效)
做了一天多的工作终于把此功能搞定了,实际上添加新场景花费不了多少时间,时间主要花在切换到另一个场景的实现上,主要原因是编译时出现了一个错误,百思不得其解,后来经过查资料不断摸索才知道自己问题的所在,改 ...
- java 浮点数
package precisenumber; //import java.util.*;public class PreciseNumber { public int fore; public int ...
- Linux集群基础
Linux集群基础 作者:Danbo 时间:2015-7-12 集群概述 什么是集群?集群是一组协同工作的服务器实体.用以提供比单一服务实体更具扩展性和可用性的平台. 集群的分类 1.HPC(High ...
- go 客户端服务端通信
client.go package main import ( "bufio" "encoding/json" "fmt" "ha ...
- RobotFramework教程使用笔记——requests和requestslibrary库
Robotframework也可以进行接口测试,只要导入相应的库就可以做到. 一.准备工作 1.导入requests,使用pip,或者手动下载 pip install requests 2.导入req ...
- pypi指定下载源
pip install -i http://pypi.douban.com/simple/ scipy==0.19.0
- BestCoder6 1002 Goffi and Squary Partition(hdu 4982) 解题报告
题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?pid=1002&cid=530 (格式有一点点问题,直接粘 ...
- servlet过滤器Filter(理论篇)
为了减少servlet容器在服务器端对信息的判断量,产生了servlet过滤器. servlet过滤器是在java servlet规范2.3中定义的,他能够对servlet容器的请求和响应对象进行检查 ...
- Unable to create Debug Bridge:Unable to start adb server:error:cannot parse version
打开Android Studio时报如下错误提示: Unable to create Debug Bridge:Unable to start adb server:error:cannot pars ...