计算机系统应用教程网站

网站首页 > 技术文章 正文

JavaScript 算法每日一题:将有序数组转换为二叉搜索树

btikc 2024-10-09 08:44:25 技术文章 13 ℃ 0 评论

大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力

铁子们!从 2024/07/26 开始,我们进入算法专题篇的学习啦 。学习计划如下:

1?? 每日一题;

2?? 学习顺序是由易到难;

3?? 题目按照数据结构进行分类;

4?? 每个类型的题目预计安排 100 道题(简单/中等/困难各 33 道);

题目描述

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

示例 1:

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

示例 2:

输入: nums = [1,3]
输出: [3,1]
解释: [1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。

提示:

  • 1 <= nums.length <= 10^4
  • -10^4 <= nums[i] <= 10^4
  • nums严格递增 顺序排列

一张图

分析/求解

要解决这个问题,我们可以利用二叉搜索树的特性,将数组的中间元素作为根节点,左右两边分别作为左右子树。以下是详细的解释和解法:

方法一:递归构建树

通过递归地选择数组的中间元素作为根节点,并对左右子数组重复该过程,最终得到平衡二叉搜索树。

  • 时间复杂度:O(n),其中 n 是数组的长度。我们需要访问数组中的每个元素。
  • 空间复杂度:O(log n),递归调用栈的深度为树的高度,最坏情况下为 O(log n)。
var sortedArrayToBST = function (nums) {
    if (nums.length === 0) {
        return null;
    }

    const mid = Math.floor(nums.length / 2);
    const root = new TreeNode(nums[mid]);
    // 递归地将数组的左半部分转换为左子树
    root.left = sortedArrayToBST(nums.slice(0, mid));
    // 递归地将数组的右半部分转换为右子树
    root.right = sortedArrayToBST(nums.slice(mid + 1));

    return root;
}

总结

在实际应用中,递归构建树是解决这个问题的最佳选择,因为它不仅能在 O(n) 的时间复杂度内高效生成平衡二叉搜索树,而且实现简单易懂。欢迎大家提供其他思路哈。

最后

如果有任何问题或建议,欢迎在评论区留言交流!祝你编程愉快!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表