前言

二叉树各种花里胡哨的算法题真的把我搞晕了,今天特地整理出一类有关二叉树的算法题,希望能帮助阅读到此文章的人,今后不再受此类题型的困扰。

一、题目类型

已知二叉树的两种遍历序列,请根据该序列构建二叉树;

①根据一棵树的前序遍历与中序遍历构造二叉树。

前序遍历 preorder = [3,9,20,15,7]

中序遍历 inorder = [9,3,15,20,7]

力扣105题

②根据一棵树的中序遍历与后序遍历构造二叉树。

中序遍历 inorder = [9,3,15,20,7]

后序遍历 postorder = [9,15,7,20,3]

力扣106题

③根据一棵树的前序遍历与后序遍历构造二叉树。

前序遍历 inorder = [1,2,4,5,3,6,7]

后序遍历 postorder = [4,5,2,6,7,3,1]

力扣889题

二、题型规律

规律啥的基本上大家都看的出来,无非就是根据手握两种遍历序列,去构建二叉树。

这题的变化点个人感觉就是给你的遍历序列,可能是字符串,可能是数组,也可能是集合,那么中间就还存在一个把序列给转换成方便我们使用的状态,例如字符串通过正则分割,然后转换为数组啥的(本文章的遍历序列是数组形式),过分点就是二叉树的结点类也要你自己写。那么节点类就这么写↓

public class TreeNode {

int val;

TreeNode left;

TreeNode right;

TreeNode(int x) { val = x; }

}

三、解题套路

1.明确序列分工(结点构建序列,左右子结点判断序列)

题目给了两个序列,我们得先明确,两个序列分别做什么工作。

第一,构建一棵二叉树一般都是从根节点开始往下构建子树(我目前没见过从子树开始往上构建到根节点的情况,但不知道有没有,话不敢说绝对,嘿嘿),既然要从根节点开始往下构建,那我们就需要一个能从根节点开始往下读取子节点的序列,符合这个要求的序列有前序遍历和后序遍历(后序遍历你倒着来看,就相当于一个改版的前序遍历:根,右,左);

第二,我们还需要一个序列,来确定我们读取的结点到底是左结点还是右结点。此时我们就需要中序遍历,如果没有中序遍历,就用后续遍历;

总结:结点构建序列:前序、后序;左右子结点判断序列:中序、后序;

2.构建结点下标查询表

将左右子结点判断序列每个节点存入哈希表中,方便我们查询下标

3.根据结点构建序列逐个构建结点(递归实现)

然后按照结点构建序列逐个构建结点,通过左右子节点判断序列判断当前构建的结点属于左结点还是右结点;

四、代码实现

①根据一棵树的前序遍历与中序遍历构造二叉树。

class Solution {

Map map = new HashMap<>();

int index = 0;

public TreeNode buildTree(int[] preorder, int[] inorder) {

for(int i = 0; i < inorder.length; i++){

map.put(inorder[i], i);

}

return build(0, preorder.length - 1, preorder);

}

public TreeNode build(int left, int right, int[] preorder){

if(left > right) return null;

int mid = map.get(preorder[index]);

TreeNode root = new TreeNode(preorder[index]);

index++;

root.left = build(left, mid - 1, preorder);

root.right = build(mid + 1, right, preorder);

return root;

}

}

②根据一棵树的中序遍历与后序遍历构造二叉树。

class Solution {

Map map = new HashMap<>();

int index = 0;

public TreeNode buildTree(int[] inorder, int[] postorder) {

for(int i = 0; i < inorder.length; i++){

map.put(inorder[i], i);

}

index = postorder.length - 1;

return build(0, postorder.length - 1, postorder);

}

public TreeNode build(int left, int right, int[] postorder){

if(left > right) return null;

int mid = map.get(postorder[index]);

TreeNode root = new TreeNode(postorder[index]);

index--;

root.left = build(left, mid - 1, postorder);

root.right = build(mid + 1, right, postorder);

return root;

}

}

③根据一棵树的前序遍历与后序遍历构造二叉树。

class Solution {

Map map = new HashMap<>();

int index = 0;

public TreeNode constructFromPrePost(int[] preorder, int[] postorder) {

for(int i = 0; i < postorder.length; i++){

map.put(postorder[i], i);

}

return build(0, postorder.length - 1, preorder);

}

public TreeNode build(int left, int right, int[] preorder){

if(left > right || index >= preorder.length) return null;

TreeNode root = new TreeNode(preorder[index]);

index++;

if(index < preorder.length && left < right){

int mid = map.get(preorder[index]);

root.left = build(left, mid, preorder);

root.right = build(mid + 1, right - 1, preorder);

}

return root;

}

}

总结

观察三种题型的解题代码,其实有很多相同之处,唯独后序遍历的递归算法有稍微一些变形,这三个代码可以一起理解,勤加练习,这类题型问题就不大了

本文分享 CSDN - 弹弹霹雳。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

java二叉树合并_Java(树的前中后序遍历构造二叉树题型整合)前序和中序、中序和后序、前序和后序遍历序列构造二叉树算法整合归纳...相关推荐

  1. java xml 合并_Java中合并XML文档的设计与实现

    为了读写XML文件,需要导入如下JAVA包,"//"后为注释说明,笔者的环境是JDK1.3.1,在JDK 1.4.0中测试也通过. Import java.io. *; //Jav ...

  2. java初学者面试_Java面试的前50个问题,面向初学者和经验丰富的程序员

    java初学者面试 您可以参加任何Java面试,无论是大四还是中级,经验或新来的人,一定会看到线​​程,并发和多线程中的几个问题. 实际上,这种内置的并发支持是Java编程语言的最强优势之一,并帮助它 ...

  3. java 图片合并_Java如何实现图片的叠加与拼接操作

    关于Java实现图片的叠加与拼接的文章网络上确实很多,碰巧小编开发工作中也遇到这些问题,就做了简要的梳理,作为笔记以备不时之需. Java对图片的处理主要使用的是BufferedImage类. Buf ...

  4. java wav合并_java – 如何将两个wav文件合并/合并到一个wav文件中?

    如果直接使用wav文件的字节,则可以在任何编程语言中使用相同的策略.对于这个例子,我假设两个源文件具有相同的比特率/ numchannels并且长度/大小相同. (如果没有,你可以在开始合并之前编辑它 ...

  5. java treeset 合并_Java中TreeSet合并重复数据

    TreeSet与HashSet之间的区别: TreeSet会自动按自然排序法给元素排序,相应的性能会差一点.而HashSet是根据元素的hashCode自动给元素排序的,如果我们不需要使用排序功能,则 ...

  6. java xml 合并_Java中合并XML文档的合并

    Private Boolean dupliate (Document doc_dup, Element father, Element son) throws Exception { Boolean ...

  7. java list合并_Java流系列之第2部:使用流执行聚合

    原文链接:https://developer.ibm.com/articles/j-java-streams-1-brian-goetz/ 关于本系列: 借助 java.util.stream 包,您 ...

  8. java pdf合并_Java 合并、拆分PDF文档

    本文将介绍如何在Java程序中合并及拆分PDF文档,合并文档时,包括合并多个不同PDF文档为一个文档,以及合并PDF文档的不同页面为一页:拆分文档是,包括将PDF文档按每一页拆分,以及按指定页数范围来 ...

  9. nio java是什么_Java NIO 的前生今世 之一 简介

    简介 Java NIO 是由 Java 1.4 引进的异步 IO. Java NIO 由以下几个核心部分组成: Channel Buffer Selector NIO 和 IO 的对比 IO 和 NI ...

最新文章

  1. Spring-boot国际化
  2. 批量修改nginx配置文件
  3. python 美化输出_python基础_格式化输出(%用法和format用法)
  4. SQL Server 存储过程 SET 语句选项
  5. Javascript弹出div层
  6. java 使用json-lib 对象,String,json互转
  7. 学软件测试看什么书籍推荐?
  8. python高级-------python2.7教程学习【廖雪峰版】(四)
  9. 转载js实现打印功能
  10. 软考软件设计师下午真题-面向对象的程序设计与实现-策略设计模式(2015年下半年试题六))代码讲解
  11. 网址导航7654推广
  12. Mysql按条件求和Sum函数
  13. 矩阵论笔记(七)——矩阵的微分和积分
  14. gPTP的理解和使用
  15. 松鼠分松果解题 c++
  16. Maven跳过单元测试配置
  17. memcachq队列安装
  18. MSF Risk Management Discipline
  19. 软件评测师:操作系统基础知识(一)
  20. 印尼央行发移动支付“新规”,这家中国公司成为“唯一”彩蛋

热门文章

  1. Leetcode--191. 位1的个数
  2. 下取整函数的含义_取整函数解读
  3. 对new int[]()的理解(转载)
  4. python百钱买百鸡问题答案_PHP/Python---百钱百鸡简单实现及优化
  5. python爬取的内容不是中午_大年初六中午,全国各区县哪里最冷?
  6. linux高亮查找关键字
  7. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 2丨连续出现的数字【难度中等】
  8. Python爬虫实现:三连文章参与抽奖
  9. postgresql 安装使用
  10. Java加密与解密的艺术~数字证书~模型分析