首先解题思路来自b站某高手,思路清奇,请看官先看视频:

无脑秒解!已知先/后序遍历与中序遍历,求后/先序遍历。_哔哩哔哩_bilibili大佬轻喷,这个题做很简单,但是想做的快做的准应该没有比这更快的了。原理是什么,问就是不知道,你们看我这破书是20年的就应该知道我是菜鸡了。随便找几个题试一下我保证你对。https://www.bilibili.com/video/BV1Xu411d7qf?spm_id_from=333.999.0.0

老铁们,看完视频是否有茅塞顿开的感觉 XD

这个方法强悍之处就在,y轴可以用前序,后序(倒过来写),层序。一行代码都不用改的情况下,可以解三种题(已知前、中序求后序;已知中、后序求前序;已知层、中序求前或后序)!

代码见下,主要是buildTreeNode()方法,完美还原了视频的解题思路,老铁们悟了记得点个赞,谢啦。

import java.util.*;public class Demo二叉树 {/**二叉树类*data 根节点*left 左子树*right 右子树*/static class TreeNode {public String data;public TreeNode left;public TreeNode right;public TreeNode(String data) {super();this.data = data;}}/*** 二叉树,根据前序遍历和中序遍历求后序遍历* @param args*/public static void main(String[] args) {String qian = "ABCDEFGHIJ";// 前序String zhong = "CBAFEDIHJG";// 中序TreeNode treeNode = new TreeNode(qian.substring(0, 1));//根节点buildTreeNode(qian, zhong, treeNode, null, null);//补全treeNode的子树List<String> resultList = new ArrayList<String>();houxu(treeNode, resultList);//解析treeNode结构,按后序遍历出来System.out.println(resultList.toString());//[C, B, F, E, I, J, H, G, D, A]}/*** 构建二叉树结构* @param qian 前序字符串 或 后序字符串倒写 或 层序字符串 (兼容3种顺序)* @param zhong 中序字符串* @param tn 二叉树(上层递归的子树)* @param leftLimit 中序字符串取值范围,左边界* @param rightLimit 中序字符串取值范围,右边界*/public static void buildTreeNode(String qian, String zhong, TreeNode tn, Integer leftLimit, Integer rightLimit) {int indexQian = qian.indexOf(tn.data);//tn的根节点在前序中的位置int indexZhong = zhong.indexOf(tn.data);//tn的根节点在中序中的位置for (int i = indexQian + 1; i < qian.length(); i++) {//在前序字符串中由前往后找tn的子树String iString = String.valueOf(qian.charAt(i));//当前要找的根节点字符int j = zhong.indexOf(iString);//在中序字符串中的位置//如果左子树没赋值,且 中序字符串中该字符在tn的根节点左边,且 在左边界的右边,则 找到左子树(的根节点)。if (tn.left == null && j < indexZhong && ((leftLimit != null && j > leftLimit) || leftLimit == null)) {tn.left = new TreeNode(iString);buildTreeNode(qian, zhong, tn.left, leftLimit, indexZhong);//递归时更新右边界,因为中序字符串中,一个二叉树的左子树的所有子树都在这个二叉树的左边。//如果右子树没赋值,且 中序字符串中该字符在tn的根节点右边,且 在右边界的左边,则 找到右子树(的根节点)。} else if (tn.right == null && j > indexZhong && ((rightLimit != null && j < rightLimit) || rightLimit == null)) {tn.right = new TreeNode(iString);buildTreeNode(qian, zhong, tn.right, indexZhong, rightLimit);//递归时更新左边界,道理和上面同理。}if (tn.left != null && tn.right != null) {break;//tn的左右子树都找到了就break,找不到也没关系,for循环完后正常结束。}}}// 前序遍历public static void qianxu(TreeNode tn, List<String> list) {if (tn == null) {return;}list.add(tn.data);qianxu(tn.left, list);qianxu(tn.right, list);}// 中序遍历public static void zhongxu(TreeNode tn, List<String> list) {if (tn == null) {return;}zhongxu(tn.left, list);list.add(tn.data);zhongxu(tn.right, list);}// 后序遍历public static void houxu(TreeNode tn, List<String> list) {if (tn == null) {return;}houxu(tn.left, list);houxu(tn.right, list);list.add(tn.data);}// 层序遍历public static void cengxu(List<TreeNode> treeNodes, List<String> list) {if (treeNodes.size() == 0) {return;}ArrayList<TreeNode> tns = new ArrayList<TreeNode>();for (TreeNode tn : treeNodes) {list.add(tn.data);if (tn.left != null) {tns.add(tn.left);}if (tn.right != null) {tns.add(tn.right);}}cengxu(tns, list);}}

二叉树已知前序中序求后序(超简单)(java)相关推荐

  1. HLG2040二叉树遍历已知前中,求后

    二叉树的遍历 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 60(34 users) Total Accepted: 34(30 us ...

  2. 二叉树的遍历(前序、中序、后序、已知前中序求后序、已知中后序求前序)

    二叉树的遍历(前序.中序.后序.已知前中序求后序.已知中后序求前序)   之前的一篇随笔(二叉树.前序遍历.中序遍历.后序遍历)只对二叉树的遍历进行了笼统的描述,这篇随笔重点对前.中.后序的遍历顺序进 ...

  3. 二叉树:已知先序和中序求后序,已知中序和后序求先序

    树的三种遍历方式的遍历顺序: 先序遍历:根.左子树.右子树(特点:第一个元素为根) 中序遍历:左子树.根.右子树(特点:根的两边分别为左子树和右子树) 后序遍历:左子树.右子树.根(特点:最后一个元素 ...

  4. 二叉树知道前序和中序求后序,知道中序后序求中序

    今天来总结下二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 首先,我们看 ...

  5. 已知前序中序输出后序(java)返回值是数组

    例子: 前序:1, 2, 3, 4, 5, 6(根左右) 中序:3, 2, 4, 1, 6, 5(左根右) 后序:3, 4, 2, 6, 5, 1(左右根) 1.先说根据前序中序求后序,前序总是沿着根 ...

  6. 根据先序和中序求后序,注意递归终止条件

    #include "stdafx.h" #include <iostream> #include <string> using namespace std; ...

  7. 已知二叉树:先序和中序求后序/后序和中序求先序

    P1030 [NOIP2001 普及组] 求先序排列 # [NOIP2001 普及组] 求先序排列 ## 题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示, ...

  8. POJ 2255 Tree Recovery(已知前序中序,求后序)

    1. 题目链接:http://poj.org/problem?id=2255 2. 题目大意: 给定二叉树的前序和中序序列,输出其后序序列 3. 思考过程: 4. AC代码 /*** @descrip ...

  9. 二叉树已知前序遍历、中序遍历画出二叉树的形状

    前序遍历: 前序遍历(VLR)是二叉树遍历的一种,也叫做先根遍历.先序遍历.前序周游,可记做根左右.前序遍历首先访问根结点然后遍历左子树,最后遍历右子树. 若二叉树为空则结束返回,否则: (1)访问根 ...

最新文章

  1. CAS SSO实践中,目前解决的问题和有待解决的问题
  2. 大工17春计算机文化基础在线测试3,大工17春《计算机文化基础》在线测试3答案...
  3. python re match groups_【原创】如何治疗使用python中re模块group、groups与findall分组匹配后产生的“眩晕反应”...
  4. c# 正则表达式 html标签,C#匹配HTML标签,正则表达式谁会?
  5. uva 1629——Cake slicing
  6. C#.Net 常用函数和方法集
  7. Tips--Altium Designer 安装时出现Account log in
  8. 区块链比特币开源_开源资金:比特币,区块链和免费软件
  9. 微服务架构的分布式事务解决方案(Dubbo分布式事务处理)
  10. 我安装java了_我安装了JAVA为什么.......
  11. concurrenthashmap获取不到_面试必问的ConcurrentHashMap
  12. 班级html网页设计实例,静态网页班级网站设计.doc
  13. theano java_theano安装问题(示例代码)
  14. 尚学堂视频笔记三:容器
  15. uc视频解析去水印原理分析及源码,集齐四大参数,兑换UC视频播放地址
  16. MySQL查询和删除重复记录
  17. 产品经理基础--04流程图与结构图
  18. 特征工程系列(一):特征工程的概念/特征的处理
  19. 查看自己的GitHub地址
  20. 实时聊天软件常用架构

热门文章

  1. 优化算法:指数加权平均
  2. linux mv合并目录,合并文件夹与MV?
  3. 小米CR660x路由器打开SSH(无需第二台路由器)
  4. 关闭后台App刷新后台应用刷新是做什么的
  5. 王者转服务器显示未登录,王者荣耀账号异常请重新登录怎么解决呢 账号异常请重新登录是什么原因[多图]...
  6. AndroidKotlin笔记——TextView赋值出现java.lang.IllegalStateException: tv must not be null
  7. JavaScript是否具有接口类型(例如Java的“接口”)?
  8. 计算机文件夹不在桌面显示,为什么我的电脑桌面上的有个文件夹里的文件突然不见了呢...
  9. 【Python绘图小课堂】词云韦恩图(上篇-分词)
  10. [转]从决策树学习谈到贝叶斯分类算法、EM、HMM