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

858 阅读3分钟

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

83. 将有序数组转换为二叉搜索树 (convert-sorted-array-to-binary-search-tree)

标签

  • BST
  • 简单

题目

leetcode 传送门

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

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

示例: image.png

示例: 二叉树:nums = [-10,-3,0,5,9],

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

image.png

基本思路

BST二叉树中序遍历 不熟的话 请移步 BST + 二叉树中序遍历

这题是个简单题,你只需知道这两点便可

  • 二叉搜索树左子树上所有节点的值均小于它的根节点的值,右子树上所有节点的值均大于它的根节点的值
  • 二叉搜索树的中序遍历结果为递增序列

写法实现

var sortedArrayToBST = function(nums) {
  const buildBST = (nums, start, end) => {
    if (start > end) {
      return null
    }
    // 取中间数 作为根 这样就平衡了
    let mid = start + Math.floor((end - start) / 2)
    const root = new TreeNode(nums[mid]);
    // 递归构建左右子树
    root.left = buildBST(nums, start, mid - 1);
    root.right = buildBST(nums, mid + 1, end);
    return root
  }
  return buildBST(nums, 0, nums.length - 1)
};

84. 有序链表转换二叉搜索树 (convert-sorted-list-to-binary-search-tree)

标签

  • BST
  • 链表
  • 中等

题目

leetcode 传送门

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

给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

给定的有序链表: [-10, -3, 0, 5, 9],

一个可能的答案是:[0, -3, 9, -10, null, 5], 

它可以表示下面这个高度平衡二叉搜索树:

      0
     / \
   -3   9
   /   /
 -10  5

基本思路

基本思路根上题差不多。也是找到 mid ,然后分治递归处理问题。只不过这次是链表操作

基本步骤

  1. 这次是链表,需要遍历下求长度 len
  2. 同上题,写出 buildTree 函数,这次没 nums这么好用,传左右指针。
  3. 注意我们用中序遍历方式,左,根,右来构建这棵树,我们用 cur指针指向当前根,然后指针后移。注意左子树先用变量表示,后与根对接
  4. 用 mid 来做构建左右子树的边界,递归去构建左右子树。

写法实现

var sortedListToBST = function(head) {
  if (head === null) return null;
  let [len, cur] = [0, head]
  // 先求出总长度
  while (head !== null) {
    len++
    head = head.next
  }

  const buildTree = (start, end) => {
    // 递归出口
    if (start > end) {
      return null
    }
    // 中序遍历,先左子树,再根,再右子树
    let mid = start + Math.floor((end - start) / 2)
    // 先递归构建左子树,我们用变量保存
    let left = buildTree(start, mid - 1)
    // 再根
    let root = new TreeNode(cur.val);
    cur = cur.next
    root.left = left
    
    // 构建右子树
    root.right = buildTree(mid + 1, end)
    return root
  }
  return buildTree(0, len - 1)
};

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

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

参考