题目描述

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

题目代码

  1. /**
  2. * Created by YuKai Fan on 2018/8/17.
  3. */
  4. public class ReBuildTreeNode {
  5. public static void main(String[] args) {
  6. ReBuildTreeNode rtn = new ReBuildTreeNode();
  7. int[] pre = {1,2,4,7,3,5,6,8};
  8. int[] in = {4,7,2,1,5,3,8,6};
  9. TreeNode treeNode = rtn.reConstructBinaryTree(pre, in);
  10. TreeNode treeNode1 = rtn.reConstructBinaryTree2(pre, 0, pre.length, in, 0, in.length);
  11. System.out.println(treeNode.left.val);
  12. }
  13.  
  14. /*
  15. 分析:
  16. 前序遍历:root->left->right
  17. 中序遍历:left->root->right
  18. 所以根据前序遍历可以得到pre[0]就是二叉树的root根节点,在根据中序遍历集合可以得到,该根节点的左边是左子树,右边是右子树
  19. 调用递归,可以将得到的前序和中序左子树集合看成一个新的二叉树,与上方同理,调用递归,而右子树也是同理可得。
  20. 方法一:
  21. 这个方法使用了数组Arrays的API:copyOfRange(array,i,j)方法,可以从i开始到j(不包括j)复制一个array数组,并产生一个新的数组,
  22. 用这种方法可以得到该二叉树的左子树和右子树,在调用递归
  23. */
  24. public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
  25. if (pre.length == 0 || in.length == 0) {
  26. return null;
  27. }
  28. TreeNode tn = new TreeNode(pre[0]);
  29. for (int i = 0; i < in.length; i++) {
  30. if (in[i] == pre[0]) {
  31. tn.left = reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1),Arrays.copyOfRange(in,0,i));
  32. tn.right = reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,pre.length),Arrays.copyOfRange(in,i+1,in.length));
  33. }
  34. }
  35. return tn;
  36. }
  37. /*
  38. 方法二
  39. */
  40. public TreeNode reConstructBinaryTree2(int [] pre,int sPre, int ePre,int [] in, int sIn, int eIn) {
  41. if (sPre > ePre || sIn > eIn) {
  42. return null;
  43. }
  44. TreeNode tn = new TreeNode(pre[sPre]);
  45. for (int i = sIn; i < eIn; i++) {
  46. if (in[i] == pre[sPre]) {
  47. tn.left = reConstructBinaryTree2(pre,sPre+1, sPre+i-sIn,in,sIn,i-1);
  48. tn.right = reConstructBinaryTree2(pre,sPre+i-sIn+1,ePre,in,i+1,eIn);
  49. }
  50. }
  51. return tn;
  52. }
  53. }
  1. /**
  2. * Created by YuKai Fan on 2018/8/17.
  3. */
  4. public class TreeNode {
  5. int val;
  6. TreeNode left;
  7. TreeNode right;
  8. TreeNode(int val) {
  9. this.val = val;
  10. }
  11. }

题目延伸

二叉树是一种非常重要的数据结构,非常多其他数据结构都是基于二叉树的基础演变而来的。对于二叉树,有深度遍历和广度遍历,深度遍历有前序、中序以及后序三种遍历方法,广度遍历即我们寻常所说的层次遍历。由于树的定义本身就是递归定义,因此採用递归的方法去实现树的三种遍历不仅easy理解并且代码非常简洁,而对于广度遍历来说,须要其他数据结构的支撑。比方堆了。所以。对于一段代码来说,可读性有时候要比代码本身的效率要重要的多。

四种基本的遍历思想为:

前序遍历:根结点 ---> 左子树 ---> 右子树

中序遍历:左子树---> 根结点 ---> 右子树

后序遍历:左子树 ---> 右子树 ---> 根结点

层次遍历:仅仅需按层次遍历就可以

一、前序遍历

依据上文提到的遍历思路:根结点 ---> 左子树 ---> 右子树,递归方法

  1. public void preOrderTraverse1(TreeNode root) {
  2. if (root != null) {
  3. System.out.print(root.val+" ");
  4. preOrderTraverse1(root.left);
  5. preOrderTraverse1(root.right);
  6. }
  7. }

二、中序遍历

依据上文提到的遍历思路:左子树 ---> 根结点 ---> 右子树,递归方法

  1. public void inOrderTraverse1(TreeNode root) {
  2. if (root != null) {
  3. inOrderTraverse1(root.left);
  4. System.out.print(root.val+" ");
  5. inOrderTraverse1(root.right);
  6. }
  7. }

三、后序遍历

依据上文提到的遍历思路:左子树 ---> 右子树 ---> 根结点

  1. public void postOrderTraverse1(TreeNode root) {
  2. if (root != null) {
  3. postOrderTraverse1(root.left);
  4. postOrderTraverse1(root.right);
  5. System.out.print(root.val+" ");
  6. }
  7. }

四、层次遍历

层次遍历的代码比較简单。仅仅须要一个队列就可以。先在队列中增加根结点。之后对于随意一个结点来说。在其出队列的时候,訪问之。同一时候假设左孩子和右孩子有不为空的。入队列。代码例如以下:

  1. public void levelTraverse(TreeNode root) {
  2. if (root == null) {
  3. return;
  4. }
  5. LinkedList<TreeNode> queue = new LinkedList<>();
  6. queue.offer(root);
  7. while (!queue.isEmpty()) {
  8. TreeNode node = queue.poll();
  9. System.out.print(node.val+" ");
  10. if (node.left != null) {
  11. queue.offer(node.left);
  12. }
  13. if (node.right != null) {
  14. queue.offer(node.right);
  15. }
  16. }
  17. }

五、深度优先遍历 事实上深度遍历就是上面的前序、中序和后序。可是为了保证与广度优先遍历相照顾,也写在这。代码也比較好理解,事实上就是前序遍历,代码例如以下:

  1. public void depthOrderTraverse(TreeNode root) {
  2. if (root == null) {
  3. return;
  4. }
  5. LinkedList<TreeNode> stack = new LinkedList<>();
  6. stack.push(root);
  7. while (!stack.isEmpty()) {
  8. TreeNode node = stack.pop();
  9. System.out.print(node.val+" ");
  10. if (node.right != null) {
  11. stack.push(node.right);
  12. }
  13. if (node.left != null) {
  14. stack.push(node.left);
  15. }
  16. }
  17. }

借鉴的博客:https://www.cnblogs.com/llguanli/p/7363657.html

java基础编程——重建二叉树的更多相关文章

  1. 6、50道JAVA基础编程练习题跟答案

    50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析 ...

  2. MQ java 基础编程

    MQ java 基础编程 编写人:邬文俊 编写时间 : 2006-2-16 联系邮件 : wenjunwu430@gmail.com 前言 通过 2 个多星期对 MQ 学习,在 partner 丁 & ...

  3. 50道JAVA基础编程练习题

    50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析 ...

  4. 50道JAVA基础编程练习题 - 题目

    50道JAVA基础编程练习题[1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? [2]题目:判断 ...

  5. JAVA基础——编程练习(二)

    JAVA编程练习(二) 今天我为了巩固之前的java基础知识的学习,再次进行实战演习,编写了一个小小的java控制台程序,主要是运用java面向对象的思想来完成这个小项目. 一.项目背景介绍 根据所学 ...

  6. JAVA基础——编程练习(一)

    java编程练习(一) 编程题目: 请根据所学知识,编写一个 JAVA 程序,实现输出考试成绩的前三名. 要求: 1. 考试成绩已保存在数组 scores 中,数组元素依次为 89 , -23 , 6 ...

  7. java基础编程练习

    1.编写程序实现对给定的 4 个整数从大到小的顺序排列. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...

  8. java基础编程题练习(一)

    1.编程实现用户输入4个整数,按从大到小的顺序排列输出. 思路:将输入的数据存入数组,使用冒泡排序对数组数据进行排序后输出数组 冒泡排序的代码如下: import java.util.Scanner; ...

  9. java基础编程

    java的类和常用编程模式还是要多练习,多手写java代码 return new String(filecontent, encoding); 看懂这个意思了吗?第一次见这个构造函数吧,而String ...

随机推荐

  1. 高斯消元法的C++简单实现

    高斯消元法 首先,我们导入几个概念. 定义1: 一个矩阵称为阶梯形(行阶梯形),若它有以下三个性质: 1.每一非零行在每一零行之上: 2.某一行的先导元素所在的列位于前一行先导元素的后面: 3.某一行 ...

  2. web综合案例03

    web综合案例03 web综合案例03 web综合案例03 web综合案例03 ... 待复习

  3. PHP异步任务worker

    1.概述 异步任务框架主要包含两个角色: WorkerServer主要负责管理(启动,重启,监控等)worker工作进程. Worker负责从指定消息队列获取任务消息并执行任务. 为了提高worker ...

  4. 多重背包(dp专题)

    题目大意:输入n,代表有n种数,接下来n个数代表n种数,再接下来n个数代表每种数有多少个,在输入K,代表用这些数要加成的和 问你是否能加为K,能输出yes,不能输出no 这是一个典型的多重背包问题,可 ...

  5. C - Watchmen

    题目链接:https://vjudge.net/contest/237394#problem/C Watchmen are in a danger and Doctor Manhattan toget ...

  6. FZU Problem 2238 Daxia & Wzc's problem

    Daxia在2016年5月期间去瑞士度蜜月,顺便拜访了Wzc,Wzc给他出了一个问题: Wzc给Daxia等差数列A(0),告诉Daxia首项a和公差d; 首先让Daxia求出数列A(0)前n项和,得 ...

  7. Java文件与io——装饰者模式

    意图: 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比于生成子类更为灵活.该模式以对客户端透明的方式扩展对象的功能. 适用环境 在不影响其他对象的情况下,以动态.透明的 ...

  8. 车牌号校验js

    var regExp = /(^[\u4E00-\u9FA5]{1}[A-Z0-9]{6}$)|(^[A-Z]{2}[A-Z0-9]{2}[A-Z0-9\u4E00-\u9FA5]{1}[A-Z0-9 ...

  9. nginx 添加https支持

    自行颁发不受浏览器信任的SSL证书为晒晒IQ网颁发证书.ssh登陆到服务器上,终端输入以下命令,使用openssl生成RSA密钥及证书. # 生成一个RSA密钥 $ openssl genrsa -d ...

  10. db2一些简单操作及错误记录

    操作: 删除主键: alter table tablename drop parimary key  添加主键: alter table tablename add primary key(colum ...