前端算法leetcode109题解有序链表转换二叉搜索树

前端算法leetcode109题解-有序链表转换二叉搜索树

题目描述

给定一个单链表 L: L0→L1→…→Ln-1→Ln ,将其转换为二叉搜索树。

示例 1:

输入: [-10,-3,0,5,9]
输出: 与示例二叉树相同
     0
    / \
  -3   9
  /   /
-10  5

示例 2:

输入: [1,2,3,4,5,6,7]
输出: 与示例二叉树相同
        4
       / \
      2   6
     / \ / \
    1  3 5  7

解题思路

这是一道 AC 的比较难的题目,我们需要通过转化,修改题目的表述,直到我们熟悉这样的题目。

一般情况下我们是有序数组变成二叉搜索树

这是一张有序数组变成的二叉搜索树:

        4
       / \
      2   6
     / \ / \
    1  3 5  7

如果数组是有序的:

[1, 2, 3, 4, 5, 6, 7]

我们可以找到中间唯一的节点 4,那么我们就可以分别递归的生成 左右子树。

生成 2 的左子树 [1, 2, 3]
生成 6 的右子树 [5, 6, 7]

当数组中的元素只剩下一个时,就生成了该节点!由于数组是有序数组,那么每次取中间节点的时间复杂度是 O(1)。总体时间复杂度是 O(nlog(n))

将上面的有序数组修改成链表

这个只要在每个节点多记录一个 parent 节点就 OJBK 了, 也就是修改了链表的实现,由原来的数组实现,修改为链表实现,其他递归的操作与前面一样。

不用每次都遍历 half 部分的链表,直接递归:左-根-右

这个 comparator 跟上一次不太一样,上一个的比较是 < ,代表哪边大,哪边继续搜索比较;这次的比较是 > ,代表哪边小,哪边继续搜索比较。

代码实现

/*
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 *
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {TreeNode}
 */

const formOrderedList = head => {
    let length = 0;
    let node = head;
    while (node !== null) {
        length++;
        node = node.next;
    }
    const array = new Array(length);
    let i = 0;
    node = head;
    while (node !== null) {
        array[i++] = node.val;
        node = node.next;
    }
    return arrayToBST(array, 0, length - 1);
};

const arrayToBST = (array, start, end) => {
    if (start > end) {
        return null;
    }

    const middleIndex = Math.floor((start + end) / 2);
    const node = new TreeNode(array[middleIndex]);
    node.left = arrayToBST(array, start, middleIndex - 1);
    node.right = arrayToBST(array, middleIndex + 1, end);

    return node;
};

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:前端算法leetcode109题解有序链表转换二叉搜索树 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • C++ 自定义单向链表 ListNode详情

    下面我将为您详细讲解“C++自定义单向链表ListNode详情”的完整攻略。 一、什么是自定义单向链表? 自定义单向链表是一种数据结构,它是由若干个节点(Node)构成的链式存储结构,其中每个节点都包含一个数据域和一个指针域,指针域指向下一个节点。与数组不同,链表的大小可以动态变化,并且可以随时插入和删除节点。 二、自定义单向链表的实现 1. 定义节点结构体…

    other 2023年6月27日
    00
  • 微信APP生命周期及页面生命周期示例详解

    微信APP生命周期及页面生命周期示例详解 微信APP生命周期 1. onLaunch(options) 当小程序初始化完成时,会触发onLaunch函数。这个函数包含一个options参数,是小程序打开所调用的方式以及打开的路径等信息。 示例: App({ onLaunch: function(options) { console.log(options) …

    other 2023年6月27日
    00
  • gmpy2安装使用方法

    以下是“gmpy2安装使用方法的完整攻略”的详细说明,包括过程中的两个示例说明。 gmpy2安装使用方法 gmpy2是Python的一个高精度计算库,它可以处理大整数、大浮点数等高精度数据。以下是一份关于gmpy2的完整攻略。 1. gmpy2基础知识 在开始使用gmpy2之前,我们需要掌握一些基础知识,例如: Python的基础知识,包括Python的类型…

    other 2023年5月10日
    00
  • Maven如何修改打包文件名称

    要修改Maven打包文件的名称,可以通过修改pom.xml文件中的配置来实现。 首先,需要在pom.xml文件中添加如下配置: <build> <finalName>my-project-name</finalName> <!– 其他插件和配置 –> </build> 其中,finalName元…

    other 2023年6月26日
    00
  • MySql字符串拆分实现split功能(字段分割转列)

    MySql字符串拆分实现split功能(字段分割转列) 在 MySql 中,没有类似 Python 中的 split 函数,可以方便地将字符串分割,但可以用以下方法实现类似 split 的功能,即将字符串拆分并分成多个字段。 步骤 创建一个数字表,用于生成序列号,数字表的个数可以根据要拆分字符串的最大长度来决定。 mysql CREATE TABLE seq…

    other 2023年6月25日
    00
  • 腾讯海量数据处理平台tdw

    以下是“腾讯海量数据处理平台tdw”的完整攻略: 腾讯海量数据处理平台tdw 腾讯海量数据处理平台tdw是一高效、可靠、易用的大数据处理平台,帮助我们处理海量数据。本攻略将细讲解tdw的基础知和应用开发技巧,包括tdw的安装、tdw的基本概念、tdw的数据、tdw的作业、tdw的应用等。 tdw的安装 tdw的安装可以通过源码编译或者二进制安装包的方式进行。…

    other 2023年5月8日
    00
  • OPPO R9s Plus手机怎么重启? OPPO手机重启的两种方法

    OPPO R9s Plus手机怎么重启? 如果你的OPPO R9s Plus手机出现卡死、无法操作或响应缓慢的问题,就需要进行重启操作。下面我将给大家介绍两种OPPO手机重启的方法。 方法一:长按电源键强制重启 首先找到手机的电源键,位于手机的右侧面。 长按电源键直到出现“谷歌”或“OPPO”等品牌标志。 松手,手机将开始重启。 这种方法适用于大多数情况,包…

    other 2023年6月26日
    00
  • 懒加载实现的分页&&网站footer自适应

    下面分别介绍懒加载实现的分页和网站footer自适应的攻略。 懒加载实现的分页 懒加载可以提高网站的加载速度,而分页则是一个常用的分隔大量数据的方式,懒加载实现的分页可以使网站看起来更加流畅。以下是懒加载实现的分页攻略: 1. 实现分页 首先,我们需要在后端实现分页。具体来说,我们可以使用ORM框架实现分页功能。例如使用Django框架,则可以使用Pagin…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部