前端算法面试必刷题系列[44]

323 阅读4分钟

这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。

80. 二叉树的最大深度 (maximum-depth-of-binary-tree)

标签

  • 二叉树的层序遍历
  • 中等

题目

leetcode 传送门

这里不贴题了,leetcode打开就行,题目大意:

给定一个二叉树,找出其最大深度

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例: 二叉树:[3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3

基本思路

这题异常简单,递归求左右子树最大深度就行了。

写法实现

var maxDepth = function(root) {
  if (root === null) {
    return 0
  }
  return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1
};

81. 从前序与中序遍历序列构造二叉树 (construct-binary-tree-from-preorder-and-inorder-traversal)

标签

  • 二叉树的遍历
  • 构造二叉树
  • 中等

题目

leetcode 传送门

这里不贴题了,leetcode打开就行,题目大意:

给根据一棵树的前序遍历中序遍历构造二叉树

注意: 你可以假设树中没有重复的元素

例如,给出

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

返回如下的二叉树:

   3
   / \
  9  20
    /  \
   15   7

基本思路

这篇思路来自于下面推荐文章的系列之一 [算法实践] 二叉树的遍历类型题实践(一)

对于任意一颗树而言,

  1. 前序遍历的形式总是 [ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]
  2. 中序遍历的形式总是 [ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]
  • 构建一个二叉树需要构建三部分:root、左子树、右子树
  • 左子树、右子树的构建,又包括:root、左子树、右子树
  • 根据根节点的定位,划分出左/右子树的 [前序,中序] 数组,其实就是准备递归的参数
  • 解题关键在于定位出根节点,划分出左右子树,然后递归构建左右子树

基本步骤

  1. preorder 的第一项肯定是根节点, 因为前序遍历的顺序是 [根 左 右]。
  2. 由根节点,在 inorder [左 根 右] 中划分出属于左、右子树的 inorder 序列。
  3. 顺便我们得到了左右子树的节点个数,在 preorder 中划分出左、右子树的 preorder 序列。
  4. 这样,我们得到左、右子树的 preorderinorder 序列,就可以递归去构建左、右子树,最终形成完整的一棵二叉树

写法实现

var buildTree = function(preorder, inorder) {
    if (preorder.length === 0) {
      return null
    }
    // 根据前序数组的第一个元素,就可以确定根节点 
    let root = new TreeNode(preorder[0])
    // 定位根节点在中序遍历的midIndex
    let midIndex = inorder.indexOf(root.val)
    // 那么左边就是左子树节点个数,右子树节点个数都知道了, 
    // 左右子树的 (前序,中序)数组就都能搞出来了
    root.left = buildTree(
        preorder.slice(1, midIndex + 1),      // 左子树的前序遍历
        inorder.slice(0, midIndex)	     // 左子树的中序遍历
    );
    root.right = buildTree(
        preorder.slice(midIndex + 1), 
        inorder.slice(midIndex + 1)
    );
    return root
};

81. 从中序与后序遍历序列构造二叉树 (construct-binary-tree-from-inorder-and-postorder-traversal)

标签

  • 二叉树的遍历
  • 构造二叉树
  • 中等

题目

leetcode 传送门

这里不贴题了,leetcode打开就行,题目大意:

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

注意: 你可以假设树中没有重复的元素

例如,给出

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

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

基本思路

同样这篇思路来自于下面推荐文章的系列之一 [算法实践] 二叉树的遍历类型题实践(一) 帮他点赞哈!

基本步骤

这题跟上题区别很小,直接看代码。

写法实现

var buildTree = function(inorder, postorder) {
  let length = postorder.length
  if (length === 0) {
    return null
  }
  let root = new TreeNode(postorder[length - 1])
  let midIndex = inorder.indexOf(root.val)
  root.left = buildTree(
  	inorder.slice(0, midIndex), 
    	postorder.slice(0, midIndex));
  root.right = buildTree(
  	inorder.slice(midIndex + 1), 
    	postorder.slice(midIndex, length - 1));
  return root
};

另外你们可以看看大哥的下一个类似但又有些不同的

从前序和后序遍历序列构造二叉树

触类旁通!

另外向大家着重推荐下这位大哥的文章,非常深入浅出,对前端进阶的同学非常有作用,墙裂推荐!!!核心概念和算法拆解系列

今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦 搜索我的微信号infinity_9368,可以聊天说地 加我暗号 "天王盖地虎" 下一句的英文,验证消息请发给我 presious tower shock the rever monster,我看到就通过,暗号对不上不加哈,加了之后我会尽我所能帮你,但是注意提问方式,建议先看这篇文章:提问的智慧

参考