前言>写此文章的主旨中心是为了给阅读的同学提供一个只有干货+实战的心得体会, 方便没有自己的学习路线的同学能够快速了解一些问题的核心以及解决问题的思路.
当然了这些内容也不是自己思考出来的,也是通过学习别人的内容总结归纳出来的,所以对于博主来说也是一个学习成长以及记录的过程, 有一些不足之处还请谅解, 希望大家都能共同进步, 汲取更多的知识, 早日找到中意的工作~
前文有提到过有关于二叉树的两种核心解题方式 分别为 遍历树节点, 与 分解子问题
主旨对应下层思想都是递归,也就是说 我们只需要抽象出对于一个独立的二叉树来说, 我们需要考虑在 前序/中序/后序的位置进行怎样的操作, 其他节点的事情均可通过递归逐一处理.
本章节主要运用此方式解决一个常见问题--构造二叉树.
1.通过前序遍历和中序遍历数组构造二叉树-> leetCode105
2.通过中序遍历和后续遍历数组构造二叉树-> leetCode106
3.通过前序遍历和后续遍历数组构造二叉树-> leetCode889
解题思路: 主要运用到前,中,后序对应遍历二叉树的特性
比如: 前序: 根->左->右 中序: 左->根->右 后序: 左->右->根
核心思想=> 构造二叉树 = 构造根节点 + 构造左子树 + 构造右子树 并且左右子树又是二叉树 呼应了前文的分解思想原理
对于题目1.
1)通过前序遍历, 我们可以明确根节点即为首个元素
2)通过根节点在中序遍历中的位置, 可以明确知道左子树的个数
3)所以可以通过已知根节点的下标, 左子树的个数, 明确左右子树对应的下标边界, 即可构造出该二叉树
分析效果如下图演示:
对应代码如下:
对于题目2, 该题的分析方式与题目1类似, 主要在于 后序的首个位置即为根节点, 即相当于调换了一下顺序, 本质没有改变
代码如下:
对于题目3, 则需要仔细思考一下, 主要问题在于, 如果没有中序遍历, 我们仅可以确定根节点, 而无法准确确定左右子树的个数,所以最终的二叉树无法确定构造
所以我们采用的方法是, 假定前序根节点后方即为左子树的根节点(实际上左子树也可以问null, 直接为右子树的根节点)
然后通过拿到该节点在后序遍历数组中的下标, 确认左子树的个数, 以此完成上述两个问题一样的构造操作, 最终得到的效果如下图
代码如下: