《剑指Offer》-004 -Java版二叉树先序和中序遍历返回原二叉树
如题 (总结要点)
- 注意空值
- 假定数据是没有问题的
- 前序(根左右) ,中序(左根右), 故每次的第一个节点就是根节点
- 没用数组的库函数,自己手写了两个方法
- 用Java代码写二叉树很舒服, 没有啥指针,直接赋值就行了!毕竟Java除了基本数据类型传参是形参, 其余都是实参传递.
- 原文链接 : https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6?tpId=13&tqId=11157&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
借鉴学习文章列表
- 链接1:
- 链接2:
ALiBaBaJavaCodingGuideLines有话说 :
1.题目
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回
2. Solution代码
/**
* FileName: ${FILENAME}
* 类的详细说明 : 1. 注意空值
* 2. 假定数据是没有问题的
* 3.前序(根左右) ,中序(左根右), 故每次的第一个节点就是根节点
* @author SongZeShan
* @version 1.0
* @Date 2019/7/11 18:10
*/
public class Solution {
/**重建出该二叉树*/
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length==0||in.length==0||pre.length!=in.length){
return null;
}
//建树,根节点赋值
TreeNode treeNode = new TreeNode(pre[0]);
int index = indexOf(in,pre[0]);
//左子树长度为index-1
treeNode.left = reConstructBinaryTree(copyRange(pre, 1, index), copyRange(in, 0, index-1));
//右子树为长度为in.length-index
treeNode.right = reConstructBinaryTree(copyRange(pre, index+1, pre.length-1), copyRange(in, index+1, pre.length-1));
return treeNode;
}
/**复制下标*/
private int[] copyRange(int arr[],int beg,int end){
int []newArr = new int[end-beg+1];
for(int i=beg;i<=end;i++){
newArr[i-beg]=arr[i];
}
return newArr;
}
/**查找key值,返回索引index*/
private int indexOf(int []arr,int key){
for(int i=0;i<arr.length;i++){
if(key==arr[i]){
return i;
}
}
return -1;
}
}
3.TreeNode 二叉树代码
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
4.测试
/**
* FileName: ${FILENAME}
* 类的详细说明
*
* @author SongZeShan
* @version 1.0
* @Date 2019/7/11 18:10
*/
public class Test {
public static void main(String[] args) {
Solution solution = new Solution();
int pre[] = {1,2,4,7,3,5,6,8};
int in[] = {4,7,2,1,5,3,8,6};
TreeNode treeNode = solution.reConstructBinaryTree(pre,in );
//输出测试
preOrder(treeNode);
System.out.println();
midOrder(treeNode);
}
/**遍历一次二叉树先序输出*/
private static void preOrder(TreeNode node){
if(node==null){
return ;
}
System.out.print(node.val+"\t");
preOrder(node.left);
preOrder(node.right);
}
/**遍历一次二叉树中序输出*/
private static void midOrder(TreeNode node){
if(node==null){
return ;
}
midOrder(node.left);
System.out.print(node.val+"\t");
midOrder(node.right);
}
}
测试结果 ,和原答案一模一样
1 2 4 7 3 5 6 8
4 7 2 1 5 3 8 6
Process finished with exit code 0
《剑指Offer》-004 -Java版二叉树先序和中序遍历返回原二叉树的更多相关文章
- 【剑指offer】Java版代码(完整版)
原文地址:https://blog.csdn.net/baiye_xing/article/details/78428561 一.引言 <剑指offer>可谓是程序猿面试的神书了,在面试中 ...
- 剑指offer】Java版代码(完整版)
转自:剑指offer]Java版代码(完整版) 转自:[剑指offer] JAVA版题解(完整版)
- 剑指offer(java版)【转】
面试题 2 :实现单例模式 1. 饿汉式单例类 public class SingletonClass { private static final SingletonClass instance=n ...
- [转]剑指offer之Java源代码
一.引言 <剑指offer>可谓是程序猿面试的神书了,在面试中帮了我很多,大部分面试的算法题都会遇到原题或者是类似的题.但是书上的代码都是C版的,我在这里整理了一份Java版的代码供大家学 ...
- 剑指Offer(第二版)面试案例:树中两个节点的最低公共祖先节点
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/74612786冷血之心的博客) 剑指Offer(第二版)面试案例:树 ...
- 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列
剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出 ...
- 剑指Offer - 九度1349 - 数字在排序数组中出现的次数
剑指Offer - 九度1349 - 数字在排序数组中出现的次数2013-11-23 00:47 题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n, ...
- 剑指Offer(二十八):数组中出现次数超过一半的数字
剑指Offer(二十八):数组中出现次数超过一半的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...
- 剑指Offer(三十五):数组中的逆序对
剑指Offer(三十五):数组中的逆序对 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/bai ...
- 剑指Offer(一):二维数组中的查找
一.前言 刷题平台:牛客网 二.题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整 ...
随机推荐
- Spring Security教程之基于方法的权限控制(十二)
目录 1.1 intercept-methods定义方法权限控制 1.2 使用pointcut定义方法权限控制 1.3 使用注解定义方法权限控制 1.3.1 JSR-25 ...
- Spring Security教程(四)
在前面三个博客的例子中,登陆页面都是用的Spring Security自己提供的,这明显不符合实际开发场景,同时也没有退出和注销按钮,因此在每次测试的时候都要通过关闭浏览器来注销达到清除session ...
- 怎么删除iOS模拟器上的应用程序?
怎么删除iOS模拟器上的应用程序: 和手机上一样,鼠标长按,点击删除 xcode 卸载模拟器 Simulator:删除目录/Library/Developer/CoreSimulator/Profil ...
- [原创]UnLua Emmylua UE4开发环境搭建
前言 公司开发的第二个虚幻4项目已经上线了,慢慢趋于稳定.回想起开荒的日子,历历在目.从引擎脚本的选择,各工具(导表,协议生成...)的重构.开发, 引擎扩展(多骨骼支持,Notify扩展,技能编辑器 ...
- .NetCore快速搭建ELK分布式日志中心
懒人必备:.NetCore快速搭建ELK分布式日志中心 该篇内容由个人博客点击跳转同步更新!转载请注明出处! 前言 ELK是什么 它是一个分布式日志解决方案,是Logstash.Elastaics ...
- python迭代有限制,突破限制
python默认迭代次数为996 需要修改才能迭代超过996 import sys sys.setrecursionlimit() #自定义扩展极限,可以自己改 def fun(n): print(n ...
- [转帖]Druid介绍及入门
Druid介绍及入门 2018-09-19 19:38:36 拿着核武器的程序员 阅读数 22552更多 分类专栏: Druid 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议 ...
- GoLang 开山篇
GoLang 开山篇 1.Golang 的学习方向 Go语言,我们可以简单的写成Golang. 2.GoLang 的应用领域 2.1 区块链的应用开发 2.2 后台的服务应用 2.3 云计算/云服务后 ...
- Python数组操作将一维数组变成二维数组
一.问题 我们在进行数组操作的时候会遇到将一个低维的数组变成一个高维的素数组 二.解决 第一种方法基本思路就是将低维数组进行等长的循环,在第一次为零的情况下,需要添加一个[]数组,原因是将它的基本框架 ...
- 基于netty手写RPC框架
代码目录结构 rpc-common存放公共类 rpc-interface为rpc调用方需要调用的接口 rpc-register提供服务的注册与发现 rpc-client为rpc调用方底层实现 rpc- ...