剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1385

题目描写叙述:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。如果输入的前序遍历和中序遍历的结果中都不含反复的数字。

比如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。

输入:

输入可能包括多个測试例子,对于每一个測试案例,

输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数。

输入的第二行包含n个整数(当中每一个元素a的范围为(1<=a<=1000)):代表二叉树的前序遍历序列。

输入的第三行包含n个整数(当中每一个元素a的范围为(1<=a<=1000)):代表二叉树的中序遍历序列。

输出:

相应每一个測试案例,输出一行:

假设题目中所给的前序和中序遍历序列能构成一棵二叉树。则输出n个整数,代表二叉树的后序遍历序列。每一个元素后面都有空格。

假设题目中所给的前序和中序遍历序列不能构成一棵二叉树。则输出”No”。

例子输入:
8
1 2 4 7 3 5 6 8 
4 7 2 1 5 3 8 6
8
1 2 4 7 3 5 6 8
4 1 2 7 5 3 8 6
例子输出:
7 4 2 5 8 6 3 1 No

这个题用递归来重建二叉树,详细代码例如以下:

#include <stdio.h>
#include <stdlib.h> #define SIZE 1001 typedef struct STreeNode
{
int data;
struct STreeNode *left;
struct STreeNode *right;
}STreeNode; int ArrPre[SIZE];
int ArrMid[SIZE];
int CanBuild; int getMidPos(int vKey, int vStart, int vEnd)
{
int i;
for (i = vStart; i < vEnd; ++i)
{
if (ArrMid[i] == vKey) return i;
}
return -1;
} void createNode(STreeNode **vNode, int vData)
{
*vNode = (STreeNode *)malloc(sizeof(STreeNode));
(*vNode)->data = vData;
(*vNode)->left = NULL;
(*vNode)->right = NULL;
} void destroyNode(STreeNode **vNode)
{
(*vNode)->left = NULL;
(*vNode)->right = NULL;
free(*vNode);
} void createBinaryTree(STreeNode **vNode, int vPreIndex, int MidIndex, int vLen)
{
if (vLen == 0) return; createNode(vNode, ArrPre[vPreIndex]);
int MidPos = getMidPos(ArrPre[vPreIndex], MidIndex, MidIndex + vLen); if(MidPos == -1)
{
CanBuild = 0;
return;
} createBinaryTree(&((*vNode)->left), vPreIndex+1, MidIndex, MidPos-MidIndex);
createBinaryTree(&((*vNode)->right), vPreIndex+(MidPos-MidIndex)+1,MidPos+1, vLen-1-(MidPos-MidIndex));
} void postTravelTree(STreeNode *vNode)
{
if (vNode == NULL) return;
postTravelTree(vNode->left);
postTravelTree(vNode->right);
printf("%d ", vNode->data);
} void destroyBinaryTree(STreeNode **vNode)
{
if (*vNode == NULL) return;
destroyBinaryTree(&((*vNode)->left));
destroyBinaryTree(&((*vNode)->right));
destroyNode(vNode);
} int main()
{
int N, i;
STreeNode *Root; while (scanf("%d", &N) != EOF)
{
for (i = 0; i < N; ++i) scanf("%d", &ArrPre[i]);
for (i = 0; i < N; ++i) scanf("%d", &ArrMid[i]); CanBuild = 1;
createBinaryTree(&Root, 0, 0, N);
if (!CanBuild)
{
printf("No\n");
}
else
{
postTravelTree(Root);
printf("\n");
} destroyBinaryTree(&Root);
} return 0;
}
/**************************************************************
Problem: 1385
User:
Language: C
Result: Accepted
Time:0 ms
Memory:920 kb
****************************************************************/

027依据前序遍历和中序遍历,重建二叉树(keep it up)的更多相关文章

  1. POJ 2255 Tree Recovery(根据前序遍历和中序遍历,输出后序遍历)

    题意:给出一颗二叉树的前序遍历和中序遍历的序列,让你输出后序遍历的序列. 思路:见代码,采用递归. #include <iostream> #include <stdio.h> ...

  2. lintcode :前序遍历和中序遍历树构造二叉树

    解题 前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / \ 1 3 注意 你可以假设树中不存 ...

  3. java编写二叉树以及前序遍历、中序遍历和后序遍历 .

    /** * 实现二叉树的创建.前序遍历.中序遍历和后序遍历 **/ package DataStructure; /** * Copyright 2014 by Ruiqin Sun * All ri ...

  4. 【C++】根据二叉树的前序遍历和中序遍历重建二叉树并输出后续遍历

    /* 现在有一个问题,已知二叉树的前序遍历和中序遍历: PreOrder:GDAFEMHZ InOrder:ADEFGHMZ 我们如何还原这颗二叉树,并求出他的后序遍历 我们基于一个事实:中序遍历一定 ...

  5. LintCode-73.前序遍历和中序遍历树构造二叉树

    前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 注意事项 你可以假设树中不存在相同数值的节点 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树:    ...

  6. HDU1710---树(知前序遍历与中序遍历 求后序遍历)

    知前序遍历与中序遍历 求后序遍历 #include<iostream> #include<cstring> #include<queue> #include< ...

  7. 剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历

    二叉树的先序,中序,后序如何遍历,不在此多说了.直接看题目描述吧(题目摘自九度oj剑指offer面试题6): 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结 ...

  8. 【算法编程 C++ Python】根据前序遍历、中序遍历重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  9. 剑指offer--(根据前序遍历和中序遍历)重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

随机推荐

  1. [Swift通天遁地]三、手势与图表-(7)创建饼形图表并导出图表为PNG图片

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. 绝对牛x的代码注释

    备注:文中字符均可以直接复制直接用! 再补上一个好玩的网站 Ascii World:(链接:http://www.asciiworld.com/). 网站上的图形很多,感兴趣的可以复制链接到浏览器上打 ...

  3. PHPExcel读取文件日期处理,含时分秒(Thinkphp)

    我们使用PHPExcel读取excel文件后发现,时间都是类似于这样的数字:41890.620138889,那么如何将它处理成我们想要的2014-09-08 14:53:00这样格式的日期呢,看代码: ...

  4. C# 将结构体转为字节流的方式

    1. 将基础类型转为byte数组存储 private byte[] CreateNetDataByteStream(ushort system, ushort host, ushort type, b ...

  5. Mysql(三):多表查询和存储程序

    今天内容: ● 多表查询(内连接 外连接 子查询) ● 存储程序(存储过程 函数) 多表查询 ​ 同时从多张数据表中查取到需要的数据即是多表查询. 多表查询时,参与查询的表中每条数据进行组合,这种效果 ...

  6. java中的结构--switch选择结构

    if-switch 选择结构 switch结构可以更好的解决等值判断问题switch 选择结构的语法:switch (表达式){ case 常量 1: //代码块1: break; case 常量 2 ...

  7. 一、CSS的基础样式

    CSS的基础样式 border 边框 复合写法 border:border-width  border-style border-color: border-width:边框宽度 top right ...

  8. python--11、数据库及SQL基础

    常用命令记录 查看库中所有表的引擎 SHOW TABLE STATUS FROM `center_main_db`; 还有一个更简洁,查询cmol_system_db库所有表的存储引擎\ SELECT ...

  9. jQuery——jQuery选择器

    基本选择器 # Id选择器 $(“#btnShow”)选择id为btnShow的一个元素 . 类选择器 $(“.liItem”)选择含有类liItem的所有元素 ele 标签选择器 $(“li”)选择 ...

  10. 将MongoDB服务器设置成Windows启动服务(win10)

    如题,这个问题也百度了很久,百度还是挺给力的,但是都没能解决问题,后来在大神(原谅我不知道大神叫什么)的指导下,终于设置成功,特分享下设置过程.. MongoDB设置数据库我就不说了...额..算了, ...