二叉树经典问题-通过前序和后序序列重建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如:给出
前序 preorder[ ] = { 3,9,20,15,7};
中序 inorder[ ] = {9,3,15,20,7};
返回
3
↙↘
9 20
↙↘
15 7
思路:由前序序列可知root的值,然后在中序中找到root,则root的左边是左子树集合,右边是右子树集合,依次这样下去,适合采用递归的写法。
题目中又说了前序遍历和中序遍历的结果中都不含重复的数字,所以在java中适合用Map集合框架中的HashMAP。
代码:
* Definition for a binary tree node.* public class Tree {* int val;* Tree left;* Tree right;* Tree(int x) { val = x; }* }*/
class solution{public Tree buildtree(int preorder[],int inorder[]){Map<Integer,Integer>map = new HashMap<Integer,Integer>(); for(int i = 0;i<preorder.length;i++){map.put(inorder[i],i); }Tree root = new buildtree(preorder,inorder,0,preorder.length-1,0,inorder.length-1,map);}public Tree buildtree(int preorder[],intinorder[],int prestart,int preEnd,int instart,int inEnd,Map<Integer,Integer>map){if(preorder==null||preorder.length==0){return null;}int rootval = preorder[prestart];Tree root = new Tree(rootval);if(prestart==preEnd){return root;}else{int rootIndex = map.get(rootval);int leftnode = rootIndex-instart;int rightnode = inEnd-rootIndex;Tree leftTree = new buildtree(preorder,inorder,prestart+1,prestart+leftnode,instart,rootIndex-1,map);Tree rightTree = new buildtree(preorder,inorder,preEnd-rightnode+1,preEnd,rootIndex+1,inEnd,map);root.left = leftTree;root.right = rightTree;return root;}}
}
总体思路就是在前序序列中找值,在后续序列中找值的位置:
preorder[a₁…];
inorder[…a₁…];
假设root的值是a1,则对于a1来说在中序遍历中a1的左子树集合(leftnode)下标集合是[instart,rootIndex],右子树集合是[rootIndex+1,inEnd]。
leftnode和righnode两个变量的目的是存左右子树的长度以便找到分别在前序遍历中的位置,两者意义差不多,这就是递归函数中传值的由来。
二叉树经典问题-通过前序和后序序列重建二叉树相关推荐
- 二叉树前序中序后序_leetcode889_go_根据前序和后序遍历构造二叉树
leetcode889_根据前序和后序遍历构造二叉树 01 - 题目 返回与给定的前序和后序遍历匹配的任何二叉树. pre 和 post 遍历中的值是不同的正整数. 示例:输入:pre = [1,2, ...
- [Leetcode][第889题][JAVA][根据前序和后序遍历构造二叉树][分治][递归]
[问题描述][中等] [解答思路] copyOfRange class Solution {public TreeNode constructFromPrePost(int[] pre, int[] ...
- 根据前序和后序遍历构造二叉树(附前序中序代码)
889. 根据前序和后序遍历构造二叉树 前序和中序 道理相同 改变一些细节就可以了,在最后附上了前序中序的代码 题目描述 返回与给定的前序和后序遍历匹配的任何二叉树. pre 和 post 遍历中的值 ...
- 先序序列和中序序列构造二叉树,中序序列和后序序列构造二叉树
1:首先读者要了解二叉树BinaryTree基本概念,其次区分左子树与左孩子节点,右子树与右孩子节点.(在数据结构中 一个节点可以成为一棵树,对于没有孩子节点的节点称为为叶子节点). 2:在 ...
- 通过前序序列和中序序列或中序序列和后序序列还原二叉树(Java)
首先看一下这个二叉树的结构,回忆一下前序序列的输出方式(中前后),中序序列的输出方式(前中后),后序序列的输出方式(前后中). 前中序列还原二叉树 此二叉树的前中序列如下所示,我们要做的就是通过这两个 ...
- 根据前序、中序序列重建一棵二叉树的代码实现
//根据前序.中序重建二叉树 BitTree* reConstructBinTree(int pre[], int startPre, int endPre,int in[], int startIn ...
- Leetcode106 由中序序列和后序序列构建二叉树
最难的地方在于对序列的下标计算,比如给定一个序列,开始下标是i,那么下标i+1就是开始元素的后一个元素,注意到,1还是当前元素组成的列表的元素个数.即i + size,是包含i元素在内的size个数组 ...
- 4、根据前序和中序,重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 前序遍历+中序遍历重建二叉树
文章目录 题目 AC代码 题目 本题链接:剑指 Offer 07. 重建二叉树 注:链接题目仅代表和本题大体相似 因为是考研笔试,本题代码以C语言去写 AC代码 代码解释:本题要求就是给定两个序列:分 ...
最新文章
- 用C语言解“12-24小时制”题
- 模型的可解释性:部分依赖图PDP和个体条件期望图ICE
- Win7安装golang开发环境--备忘录
- Spring 事务传播行为的理解
- RMAN的一些术语解释
- 为C# Windows服务添加安装程序
- Webpack基础之入口起点
- 麻省理工学院给研究生的文献阅读方法,简单高效!
- 系统动力学模型_蓝谷学术动态|典型海洋生态系统动力学模型构建、应用及发展入选2020年经典中国国际出版工程...
- c++ datetime mysql_转:C++操作mysql方法总结(1)
- 在LoadRunner里何时该用 .NET Vuser协议?
- .NetCF 绘制半透明效果
- Android 多媒体开发学习之简单的音乐播放器
- 牛顿插值法,泰勒公式
- 2019美国大学计算机本科排名,美国大学计算机排名2019最新排名
- 批量提取word doc文档中的表格
- 转载 美国SAP高手跳槽记-转自George
- 平板上pyto软件_平板电脑性价比排行大更新!
- window.onload的用法
- Selenium 键盘事件 操作大全