重建二叉树

题目描述

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

题目链接: 重建二叉树

代码

import java.util.*;

public class Jz04 {

    // 缓存中序遍历数组每个值对应的索引
private static Map<Integer, Integer> indexForInOrders = new HashMap<Integer, Integer>(); public static TreeNode reConstructBinaryTree(int[] pre, int[] in) {
for (int i = 0; i < in.length; i++) {
indexForInOrders.put(in[i], i);
}
return reConstructBinaryTree(pre, 0, pre.length - 1, 0);
} /**
* 递归
*
* @param pre
* @param preL
* @param preR
* @param inL
* @return
*/
private static TreeNode reConstructBinaryTree(int[] pre, int preL, int preR, int inL) {
if (preL > preR) {
return null;
}
TreeNode root = new TreeNode(pre[preL]);
int inIndex = indexForInOrders.get(root.val);
int leftTreeSize = inIndex - inL;
root.left = reConstructBinaryTree(pre, preL + 1, preL + leftTreeSize, inL);
root.right = reConstructBinaryTree(pre, preL + leftTreeSize + 1, preR, inL + leftTreeSize + 1);
return root;
} public static void main(String[] args) {
// 测试用例,并打印最后结果
int[] pre = new int[]{3, 9, 20, 15, 7};
int[] in = new int[]{9, 3, 15, 20, 7};
TreeNode treeNode = reConstructBinaryTree(pre, in);
Queue<TreeNode> nodes = new LinkedList<>();
nodes.add(treeNode);
while (!nodes.isEmpty()) {
TreeNode cur = nodes.poll();
if (cur != null) {
System.out.println(cur.val + " ");
nodes.add(cur.left);
nodes.add(cur.right);
}
}
}
}

【每日寄语】 你的微笑是最有治愈力的力量, 胜过世间最美的风景。

JZ-004-重建二叉树的更多相关文章

  1. 剑指Offer面试题:5.重建二叉树

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

  2. NYOJ-756重建二叉树

    重建二叉树 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数据(少于 ...

  3. 剑指Offer 通过中序和先序遍历重建二叉树

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

  4. nyoj756_重建二叉树_先序遍历

    重建二叉树 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!).   输入 输入有多组数 ...

  5. 剑指offer 面试题6:重建二叉树

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

  6. 剑指OFFER之重建二叉树(九度OJ1385)

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

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

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

  8. 九度OJ 1385 重建二叉树

    题目地址:http://ac.jobdu.com/problem.php?pid=1385 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都 ...

  9. nyoj 756 重建二叉树

    重建二叉树主要是给你一颗二叉树的前序遍历的结果和中序遍历的结果或者后序遍历的结果或者中序遍历的结果,让你求出其中的后序遍历的结果或者前序遍历的结果,这里知道其中的两个就能求出第三个,但是知道的两个必须 ...

  10. 剑指offer-面试题6.重建二叉树

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

随机推荐

  1. 图论+回溯解QQ一笔画红包

    [春节整活] QQ的一笔画红包有几个特性: 1.最大为5×5的点阵,所以可以把每个点从左到右,从上到下标为1-25号点 2.每两个点只能存在一条线 3.线可以被盖住(例如连接2-1-3,2-1的线会被 ...

  2. 服务器+nextcloud搭建自己的私有云盘

    简介 Nextcloud是一款开源免费的私有云存储网盘项目,可以让你快速便捷地搭建一套属于自己或团队的云同步网盘,从而实现跨平台跨设备文件同步.共享.版本控制.团队协作等功能.它的客户端覆盖了Wind ...

  3. CSS之单行、多行文本溢出显示省略号

    单行文本溢出显示省略号: overflow: hidden text-overflow: ellipsis white-space: nowrap 多行文本溢出 display: -webkit-bo ...

  4. foreEach 跳出循环

    const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; const _ = require('lodash'); let outArr = []; try { arr. ...

  5. Android中ActionBar和ToolBar添加返回箭头

    感谢大佬:https://blog.csdn.net/baidu_32682229/article/details/77927745 ActionBar添加返回箭头 //onCreate方法中 Act ...

  6. Java线程--CopyOnWrite容器使用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871602.html Java线程--CopyOnWrite容器使用 CopyOnWrit容 ...

  7. 【第十八期】分享一个网易go面经

    自我介绍 未来的主要方向 介绍下之前的项目用到的优化点.难点 为什么不要大量使用goroutine gpm模型 go里面goroutine创建数量有限制吗? 线程和协程有什么区别 golang支持哪些 ...

  8. postman常用测试脚本

    测试脚本: 设置环境变量 var jsonData = JSON.parse(responseBody); postman.setGlobalVariable("5KMST", j ...

  9. Solution -「多校联训」I Love Random

    \(\mathcal{Description}\)   给定排列 \(\{p_n\}\),可以在其上进行若干次操作,每次选取 \([l,r]\),把其中所有元素变为原区间最小值,求能够得到的所有不同序 ...

  10. java中的运算符介绍

    运算符&和&&的区别&运算符有两种用法:(1)按位与:(2)逻辑与. &&运算符是短路与运算.逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右 ...