关于leetcode:前端工程师leetcode算法面试必备二叉树的构造和遍历

27次阅读

共计 1405 个字符,预计需要花费 4 分钟才能阅读完成。

一、前言

  上一篇中介绍了如何采纳 DFS 和 BFS 的搜寻思维去实现二叉树的前序遍历、中序遍历、后序遍历以及分层遍历。

  这一节次要介绍 Medium 难度中比拟常见的一种题型: 依据各种遍历结构二叉树

二、1008. 先序遍历结构二叉树

返回与给定先序遍历 preorder 相匹配的二叉搜寻树(binary search tree)的根结点

  本道题目要求结构一棵 BST,使得它的前序遍历序列与给定的 preorder 匹配。

  首先,对二叉树进行前序遍历,能够失去如下序列:

  根节点 --> 左子树 --> 右子树 

  显然,依据前序序列,能够确定第一个元素就是根节点,那么接下来的问题就是如何找到左右子树的宰割点?

  回顾一下 BST 的个性:

  • 左子树的元素都比根元素小;
  • 右子树的元素都比根元素大;
  • BST 中不存在反复的元素;

联合上述性质: 通过根节点与序列中元素的大小比拟能够失去左右子树的宰割点

三、105. 从前序与中序遍历序列结构二叉树

依据一棵树的前序遍历与中序遍历结构二叉树。留神: 你能够假如树中没有反复的元素。

  本道题目要求结构一棵一般的二叉树,而非 BST。

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

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

  从上述两个遍历序列中,大家应该曾经发现宰割左右子树的条件就藏在中序遍历中。

   依据前序遍历失去根元素,再遍历中序遍历序列失去根元素的下标,从而宰割左右子树 。如果二叉树中存在反复元素,那么这种计划是行不通的,这也是此类型题目一个重要的条件。

四、106. 从中序与后序遍历序列结构二叉树

依据一棵树的中序遍历与后序遍历结构二叉树。留神: 你能够假如树中没有反复的元素。

  本题的解题思路与上一道题的解题思路一模一样,所以正好借用本道题目介绍一下工夫复杂度的优化。

  上一题解题代码的耗时操作次要在于频繁地应用 shift、indexOf 和 slice。

   对于 indexOf 操作,能够采纳 HashTable 代替,这是经典的空间换工夫的优化形式。

   而对于 shift 和 slice,能够采纳多指针记录下标来解决 。这里的下标计算有点简单,倡议大家本人画一画遍历的过程,不然很难明确写法的推导过程。

五、889. 依据前序和后序遍历结构二叉树

返回与给定的前序和后序遍历匹配的任何二叉树。pre 和 post 遍历中的值是不同的正整数。

  还是老套路,先察看两个遍历序列:

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

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

  这不是相熟的感觉啊,看来看去,根节点也不好将左右子树宰割啊!?

  当初,尝试开展左右子树: 参考视频:传送门

  前序遍历:根节点 --> (根节点 --> 左子树 --> 右子树) --> 右子树

  后续遍历:(左子树 --> 右子树 --> 根节点) --> 右子树 --> 根节点 

  是不是有点清朗了,再把左右根节点去掉,是不是发现依据左子树的根节点,能够将左右子树宰割开呀。

  前序遍历:(根节点 --> 左子树 --> 右子树) --> 右子树

  后续遍历:(左子树 --> 右子树 --> 根节点) --> 右子树 

写在最初

  算法作为计算机的基础学科,用 JavaScript 刷,一点也不丢人 ε =ε=ε=┏(゜ロ゜;)┛。

  本系列文章会别离给出一种算法的 3 种难度的总结篇(简略难度,中等难度以及艰难难度)。在简略难度中,会介绍该算法的基本知识与实现,另外两个难度,着重解说解题的思路。

  如果本文对您有所帮忙,能够点赞或者关注来激励博主。

正文完
 0