剑指offer_(4)
重建二叉树:
题目描述
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x){
val = x;
}
}
import java.util.HashMap; /**
* 先序数组: 1,2,4,7,3,5,6,8 中序数组:4,7,2,1,5,3,8,6
* 思路:1.先序数组中最左边的值就是树的头节点值,记为和,并且用h生成
* 头节点,记为head。然后在中序数组中找到h,假设位置为i。那么在
* 中序数组中,i左边的数组就是头节点左子树的中序数组,假设长度
* 为L,则左子树的先序数组就是先序数组中h往右长度也为L的数组
* 例如:二叉树头节点的值为1,在数组中找到1的位置,1的左边数组为
* 4,7,2 是头节点左子树的中序数组,长度为3; 先序数组中1的右边长度
* 也是3的数组为:2,4,7 , 也就是左子树的先序数组。
* 2. 用左子树的先序和中序数组,递归整个过程建立左子树,返回的头节点记为left。
* 3. i右边的数组就是头结点右子树的中序数组,假设长度为r。先序数组中右侧等长
* 部分就是头节点右子树的先序数组。
* 例如:中序数组中1的右边数组为:5,3,8,6,长度为4; 先序数组右侧等长的部分为:
* 3,5,6,8,他们分别是头节点右子树的中序和先序数组。
* 4. 用右子树的先序和中序数组,递归整个过程建立右子树,返回的节点记为right。
* 5. 把head的左孩子和有孩子分别设为left和right,返回head,过程结束。
*
* 如果二叉树的节点数为N,在中序数组中找到位置i的过程可以用哈希表来实现,这样整个
* 过程时间复杂度为O(n)。
*/
public class Solution { public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre == null || in == null){
return null;
}
HashMap<Integer, Integer> map = new HashMap<>();
for(int i=0; i < in.length; i++){
map.put(in[i],i);
}
return preIn(pre, 0, pre.length -1 , in, 0, in.length -1, map);
} /**
* 递归函数
* @param p 前序数组
* @param pi 前序数组的初始下标
* @param pj 前序数组的结束下标
* @param n 中序数组
* @param ni 中序数组的初始下标
* @param nj 中序数组的结束下标
* @param map 中序值和位置的map集合
* @return
*/
public TreeNode preIn(int[] p, int pi, int pj, int[] n, int ni, int nj, HashMap<Integer,Integer> map){ if(pi > pj){
return null;
}
//头节点
TreeNode head = new TreeNode(p[pi]);
//头节点在中序的位置
int index = map.get(p[pi]);
head.left = preIn(p, pi + 1, pi + index - ni, n, ni, index -1, map);
head.right = preIn(p, pi + index - ni + 1, pj, n, index + 1, nj, map);
return head;
} }
剑指offer_(4)的更多相关文章
- 剑指offer_(17)
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) public class Solution17 { /*思路:参考剑指offer 1.首先设置标志 ...
- 剑指offer_面试题6_重建二叉树(分解步骤,逐个击破)
题目:输入某二叉树的前序遍历和中序遍历的结果.请重建出该二叉树.如果输入的前序遍历和中序遍历的结果中都不含反复的数字. 比如:输入前序遍历 {1,2,4,7,3,5,6,8} 和中序遍历序列 {4,7 ...
- 剑指offer_面试题11 数值的整数次方_考察代码的完整性
测试通过代码: package t0825; public class Power { public static void main(String[] args){ System.out.print ...
- 剑指offer_快速查找递增二维数组中是否存在目标
[编程题]二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- 牛客_剑指offer_重建二叉树,再后续遍历_递归思想_分两端
总结: 重建二叉树:其实就是根据前序和中序重建得到二叉树,得到后续,只要输出那边设置输出顺序即可 [编程题]重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的 ...
- 剑指offer_数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P. 并将P对1000000007取模的结果输出. 即输出P%100 ...
- 剑指Offer_编程题之二维数组中的查找
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.
- 剑指Offer_编程题之重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 剑指Offer_编程题_25
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...
随机推荐
- 在DataTable数据类型最后增加一列,列名为“Column”,内容都为“AAA”
DataTable dt = new DataTable(); dt.Columns.Add("Column", typeof(string)); foreach (DataRow ...
- spring mvc在Controller中获取ApplicationContext
spring mvc在Controller中获取ApplicationContext web.xml中进行正常的beans.xml和spring-mvc.xml的配置: 需要在beans.xml中进行 ...
- chrome打开清除浏览数据窗口快捷键
Ctrl+Shift+Del 打开清除浏览数据窗口 热键组合 实现的功能 F1 Google浏览器帮助中心 F12 打开Chrome控制台 Ctrl+J 进入“下载内容”页面 Ctrl+H 查看“历史 ...
- There is no getter for property named 'userId' in 'class java.lang.String'
[ERROR] 2017-01-18 04:37:06:231 cn.dataenergy.common.CenterHandlerExceptionResolver (CenterHandlerEx ...
- 分享一个基于thrift的java-rpc框架
简单介绍 这是一个简单小巧的Java RPC框架,适用于Java平台内.为系统之间的交互提供了.高性能.低延迟的方案.适合在集群数量偏少的情况下使用(50台以下集群环境).当然.它也可以在大型集群环境 ...
- webSocket错误收集
关于 使用WebSocket报如下错误, Uncaught InvalidStateError: Failed to execute 'send' on 'WebSocket': already in ...
- PHP静态成员变量
静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员.. ...
- PLSQL游标使用
游标是一个指针,它指向一块SQL区域,该区域用于存储处理过来的SELECT或者其他的DML操作返回的数据.由PLSQL创建并管理的游标成为隐式游标,用户创建并管理的成为显示游标.游标可以看做是指向记录 ...
- Android jni 编程2(对基本类型一维整型数组的操作)
参考教程和这位博主的对一维数组的处理,主要包括以下三种类型: //传入一维数组,无返回值 public native void arrayEncode(int[] arr); //传一个一维数组和数组 ...
- php in_array语法
bool in_array ( mixed $needle , array $haystack [, bool $strict ] ) 返回值为直或假 var_dump(in_array( ...