027依据前序遍历和中序遍历,重建二叉树(keep it up)
剑指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)的更多相关文章
- POJ 2255 Tree Recovery(根据前序遍历和中序遍历,输出后序遍历)
题意:给出一颗二叉树的前序遍历和中序遍历的序列,让你输出后序遍历的序列. 思路:见代码,采用递归. #include <iostream> #include <stdio.h> ...
- lintcode :前序遍历和中序遍历树构造二叉树
解题 前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / \ 1 3 注意 你可以假设树中不存 ...
- java编写二叉树以及前序遍历、中序遍历和后序遍历 .
/** * 实现二叉树的创建.前序遍历.中序遍历和后序遍历 **/ package DataStructure; /** * Copyright 2014 by Ruiqin Sun * All ri ...
- 【C++】根据二叉树的前序遍历和中序遍历重建二叉树并输出后续遍历
/* 现在有一个问题,已知二叉树的前序遍历和中序遍历: PreOrder:GDAFEMHZ InOrder:ADEFGHMZ 我们如何还原这颗二叉树,并求出他的后序遍历 我们基于一个事实:中序遍历一定 ...
- LintCode-73.前序遍历和中序遍历树构造二叉树
前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 注意事项 你可以假设树中不存在相同数值的节点 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: ...
- HDU1710---树(知前序遍历与中序遍历 求后序遍历)
知前序遍历与中序遍历 求后序遍历 #include<iostream> #include<cstring> #include<queue> #include< ...
- 剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历
二叉树的先序,中序,后序如何遍历,不在此多说了.直接看题目描述吧(题目摘自九度oj剑指offer面试题6): 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结 ...
- 【算法编程 C++ Python】根据前序遍历、中序遍历重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 剑指offer--(根据前序遍历和中序遍历)重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
随机推荐
- Idea使用Maven搭建SpringMVC的HelloSpringMvc并配置插件Maven和Jetty
这篇博文只是纯粹的搭建一个SpringMVC的项目, 并不会涉及里面配置文件该写些什么. 只是纯粹的搭建一个初始的Hello SpringMVC的项目. 废话不多说,上图. 1. 打开IDEA 并且 ...
- 【BZOJ1124】[POI2008]枪战Maf(基环树_构造)
被教练勒令做题不能看题解后的第一道新题,自行 yy 了好久终于 AC 了(菜啊)--写博客纪念. 题目: BZOJ1124 分析: 考虑每个人向他要打的人连边.根据题意,所有点都有且只有一条出边.那么 ...
- python导入包出错:ImportError: No module named XXXXX
python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用. 如果想 ...
- UNIX环境高级编程--9. 进程控制
进程关系 当子进程终止时,父进程得到通知并能取得子进程的退出状态. 终端登录: 早起UNIX系统通过哑终端登录,本地的终端 or 远程的终端 .主机上链接的终端设备是固定的,所以同时登录数 ...
- Offer收割_4
1.水题 2.BFS宽搜(使用优先队列priority_queue) 4.题意:给数组a.要求重排列数组,使得数组中的任意相邻的两个元素不同.如果存在多个方案,那么选择字典序最小的方案. 如果不能满 ...
- 学习c语言的感想
其实个人认为无论学习什么语言,最重要的是掌握习编程思想,然而C语言一种学习编程思想的基础语言.所以,C语言的重要性不言而喻. 一.课本 无论用的是什么书,要学好C语言,把书上的每一个例题.习题的代码读 ...
- sql server 无法创建数据库,错误代码:1807
SQL Server 不能创建数据库,发生错误:1807 :未能获得数据库 'model' 上的排它锁.请稍后重试操作. declare @sql varchar(100) while ...
- MySQL索引----数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- react杂记
React webpack+react (hello world) 项目结构: src: app.js main.js package.json webpack_dev_config.js 需要安装包 ...
- 常用animation动画
/*编辑动画名*/ animation-name: myDemo; /*动画持续时间*/ animation-duration: 6s; /*动画方向*/ /*reverse 反向*/ /*alter ...