前端算法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日

相关文章

  • eclipse中运行项目runas选项只有run configuration的解决方法

    以下是关于“Eclipse中运行项目Run As选项只有Run Configuration的解决方法”的完整攻略,过程中包含两个示例。 背景 Eclipse是一种流行的Java集成开发环境(IDE),它可以帮助我们轻松地开发、测试和部署Java应用程序。在Eclipse中,我们可以使用“Run As”选项运行我们的Java。然而,有时候“Run As”选项只…

    other 2023年5月9日
    00
  • 相机SD卡提示未格式化 文件系统损坏 照片怎么恢复的解决方法介绍

    相机SD卡提示未格式化 文件系统损坏 照片恢复解决方法 问题描述 当我们将相机SD卡插入电脑或相机时,有可能会遇到提示“未格式化”、“文件系统损坏”的情况,这时候我们就无法访问SD卡上的照片和其他文件,非常困扰。下面我将介绍几种解决该问题的方法。 方法一:使用数据恢复软件 在计算机上安装数据恢复软件,比如Recuva(免费)、Stellar Data Rec…

    other 2023年6月27日
    00
  • 怎样使用bluescreenview查看电脑蓝屏原因

    怎样使用Bluescreenview查看电脑蓝屏原因 Bluescreenview是一款免费的Windows工具,可以帮助用户分析和诊断电脑蓝屏错误。它可以读取Windows系统的minidump,并显示有关蓝屏错误的详细信息。本文将提供一个完整的攻略,介绍如何使用Bluescreenview查看电脑屏原因,并提供两个示例说明。 Bluescreenview…

    other 2023年5月8日
    00
  • Java安全-ClassLoader

    Java安全-ClassLoader 什么是ClassLoader? 在Java中,ClassLoader(类加载器)是Java虚拟机的基础组件之一,负责加载Java类文件。ClassLoader从文件系统、ZIP归档文件、JAR文件、网络上动态下载等途径中查找和装载类。在Java程序运行过程中,一个类只会被ClassLoader载入一次。ClassLoad…

    other 2023年6月25日
    00
  • 学习Javascript面向对象编程之封装

    下面我将详细讲解学习Javascript面向对象编程之封装的完整攻略。 什么是封装 封装(Encapsulation)是一种将数据与操作数据的方法表示为一个单一实体(即类)的技术。封装可以使得类的对象被访问时不能直接访问对象的状态,而是通过类公开的接口进行操作。封装有助于提高代码的安全性和可维护性。 如何封装 在JavaScript中,封装通常通过构造函数和…

    other 2023年6月26日
    00
  • Android实现粒子雨效果

    关于“Android实现粒子雨效果”的完整攻略,包括以下几个步骤: 1. 引入依赖库 我们需要在项目的build.gradle文件中引入依赖库: dependencies { implementation ‘com.airbnb.android:lottie:3.6.0’ } 其中,lottie库是一个支持Android, iOS, React Native…

    other 2023年6月26日
    00
  • ApplicationListenerDetector监听器判断demo

    首先,我们需要了解什么是ApplicationListenerDetector监听器。ApplicationListenerDetector监听器是Spring框架中的一个监听器,用于监听ApplicationEvent事件的触发。我们可以通过它来判断Spring容器中是否存在特定的监听器。 接下来,我们需要实现一个ApplicationListenerDe…

    other 2023年6月27日
    00
  • IOS实现百度地图自定义大头针和气泡样式

    下面我就为你详细讲解“IOS实现百度地图自定义大头针和气泡样式”的完整攻略。 一、前置条件 在进行下面的操作前,先确保你已经完成以下步骤: 在百度地图开放平台上注册并创建应用,获取相应的AK。 集成百度地图SDK,并在App中显示地图。 二、自定义大头针 创建自定义的大头针视图 为了自定义大头针,我们需要创建一个自定义的大头针视图。可以继承BMKPinAnn…

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