重建二叉树:

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
 
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)的更多相关文章

  1. 剑指offer_(17)

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) public class Solution17 { /*思路:参考剑指offer 1.首先设置标志 ...

  2. 剑指offer_面试题6_重建二叉树(分解步骤,逐个击破)

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

  3. 剑指offer_面试题11 数值的整数次方_考察代码的完整性

    测试通过代码: package t0825; public class Power { public static void main(String[] args){ System.out.print ...

  4. 剑指offer_快速查找递增二维数组中是否存在目标

    [编程题]二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数     ...

  5. 牛客_剑指offer_重建二叉树,再后续遍历_递归思想_分两端

       总结:    重建二叉树:其实就是根据前序和中序重建得到二叉树,得到后续,只要输出那边设置输出顺序即可 [编程题]重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的 ...

  6. 剑指offer_数组中的逆序对

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P. 并将P对1000000007取模的结果输出. 即输出P%100 ...

  7. 剑指Offer_编程题之二维数组中的查找

    题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.

  8. 剑指Offer_编程题之重建二叉树

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

  9. 剑指Offer_编程题_25

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...

随机推荐

  1. Java 字符终端上获取输入三种方式

    http://blog.csdn.net/hongweigg/article/details/14448731 在Java 字符终端上获取输入有三种方式: 1.java.lang.System.in ...

  2. FMS用AS来实现拉流

    application.onAppStart=function (){ this.myNC=new NetConnection(); this.myNC.onStatus=NC_onStatus; t ...

  3. MVC + AngularJS 初体验(实现表单操作)

    AngularJS AngularJS 通过新的属性和表达式扩展了 HTML. AngularJS 可以构建一个单一页面应用程序(SPAs:Single Page Applications). Ang ...

  4. selenium相关面试题

    selenium中如何判断元素是否存在? selenium中hidden或者是display = none的元素是否可以定位到? selenium中如何保证操作元素的成功率?也就是说如何保证我点击的元 ...

  5. POJ1556(割点)

    SPF Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8114   Accepted: 3716 Description C ...

  6. POJ1664(整数划分)

    放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30894   Accepted: 19504 Description ...

  7. jq-实战之表格筛选

    css部分 .select{background: #ccc} html部分 table width="> <thead> <th>姓名</th> ...

  8. CSS中:visited的隐私保护

    CSS 伪类 (Pseudo-classes) 锚伪类:在支持 CSS 的浏览器中,链接的不同状态都可以不同的方式显示,这些状态包括:活动状态,已被访问状态,未被访问状态,和鼠标悬停状态. a:lin ...

  9. 微软Visual Studio二十周年:VS2017于3月7日发布

    二十年前的今天,微软正式发布Visual Studio 97.如今二十年已经过去,微软宣布全新的Visual Studio 2017即将在美国当地时间3月7日正式发布. VS97是Visual Stu ...

  10. C# 6 与 .NET Core 1.0 高级编程 - 40 ASP.NET Core(下)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 40 章  ASP.NET Core(下)),不对的地方欢迎指出与交流. 章节出自<Professiona ...