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

yizhihongxing

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

相关文章

  • 机械师未来战舰II代主机测评 超性价比的整机解决方案

    机械师未来战舰II代主机测评 1. 硬件配置概览 机械师未来战舰II代主机采用了AMD Ryzen 5 3600处理器和NVIDIA GeForce RTX 2060显卡,配备了16GB DDR4内存和512GB NVMe SSD。这样的配置足以满足大多数游戏和图像处理的需求。 2. 性能测试 我们进行了多个性能测试,在游戏中使用了最高画质设置。以下为部分测…

    other 2023年6月26日
    00
  • 详解DevEco Studio项目构建讲解、编写页面、布局介绍、页面跳转

    详解DevEco Studio项目构建、编写页面、布局介绍、页面跳转攻略 1. 项目构建 在DevEco Studio中,可以按照以下步骤构建项目: 打开DevEco Studio,点击菜单栏的 \”File\” -> \”New\” -> \”Project\”。 在弹出的窗口中选择项目类型和模板,填写项目名称和路径,然后点击 \”Next\”…

    other 2023年10月13日
    00
  • 基于layui table返回的值的多级嵌套的解决方法

    基于layui table返回的值的多级嵌套的解决方法攻略 在使用layui table组件时,有时候需要处理多级嵌套的数据结构。本攻略将详细讲解如何解决这个问题,并提供两个示例说明。 解决方法 要解决基于layui table返回的值的多级嵌套问题,可以采用以下步骤: 定义数据结构:首先,需要定义一个合适的数据结构来表示多级嵌套的数据。可以使用对象或数组来…

    other 2023年7月28日
    00
  • 苹果iOS9.3.2 Beta1开发者预览版固件更新发布 bug修复和改进

    苹果iOS9.3.2 Beta1开发者预览版固件更新发布 bug修复和改进攻略 苹果公司于2016年4月7日发布了iOS 9.3.2 Beta1 开发者预览版固件更新。此次更新修复了若干软件缺陷和提高了性能优化,让用户体验更加完善。 安装iOS 9.3.2 Beta1预览版 要安装 iOS 9.3.2 Beta1 预览版,首先要成为苹果开发者,然后就可以前往…

    other 2023年6月26日
    00
  • 抖音小程序如何获得更多流量技巧分享

    当谈及抖音小程序获得更多流量技巧分享的时候,以下是一些重点策略和实用技巧: 1. 好的小程序页面设计 小程序的页面设计是吸引访问者的关键。当设计小程序页面时,需要考虑页面布局、配色、字体、图像、动画和其他方面,从而使用户感到舒适和愉悦。 在小程序的设计过程中,需要注重以下几个方面: 页面布局 合理的页面布局可以使小程序更加直观易懂,简单易用。要学会合理的布局…

    other 2023年6月26日
    00
  • 详解Java继承中属性、方法和对象的关系

    关于“详解Java继承中属性、方法和对象的关系”的攻略,我将从以下几个方面进行讲解: 继承的概念及特点 继承中属性的关系及访问方式 继承中方法的关系及重写方式 继承中对象的关系及实例化方式 示例说明 1. 继承的概念及特点 继承是面向对象编程中的一种重要机制,它允许定义一个类,该类继承自另一个已经存在的类,从而继承其属性和方法。继承的特点主要包括以下几个方面…

    other 2023年6月27日
    00
  • mininet是什么?

    Mininet是一个用于建立和测试软件定义网络(SDN)和网络功能虚拟化(NFV)的仿真工具。它提供一个虚拟化的网络环境,使用户可以在单个机器上创建一个网状拓扑结构,包括虚拟交换机、路由器、主机等,并进行各种网络测试、性能分析、应用开发等操作。本篇攻略将详细讲解Mininet的基本概念、安装方法、基本操作以及两个示例说明。 Mininet的基本概念 虚拟化网…

    其他 2023年4月16日
    00
  • 解析Java 泛型什么情况下不能使用

    解析 Java 泛型什么情况下不能使用 在 Java 中,泛型相对于传统的数据类型更加灵活和安全,但是也有一些情况下需要注意,泛型可能不适用或者引发问题,本攻略将详细讲解 Java 泛型在何种情况下不能使用。 一、静态变量不能使用泛型类型参数 在 Java 中,静态变量是在类加载时被初始化的,并且可以被类及其所有实例共享,而泛型的类型参数是在实例化对象时指定…

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