【每天学习一点算法 2025/12/22】将有序数组转换为二叉搜索树

每天学习一点算法 2025/12/22

题目:将有序数组转换为二叉搜索树

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

前几天才做了验证二叉搜索树,我们知道严格递增的有序数组,恰好是对应平衡二叉搜索树(BST)的中序遍历结果,那么根节点的值就是这个数组中间的那个数字,子树的根节点又是数组根节点值(也就是中间的值)处分割开后两边数组的中间值,那么我们可以递归生成子树的根节点从而生成完整的二叉搜索树。

typescript 复制代码
function sortedArrayToBST(nums: number[]): TreeNode | null {
  // 辅助函数:递归构建BST
  function auxiliaryFun(nums: number[], start: number, end: number): TreeNode | null {
    // 递归终止条件:区间无效
    if (start > end) return null;

    // 取左中位数,也可以取右中位数
    const mid = start + Math.floor((end + start) / 2);

    // 以中位数为根节点
    const root = new TreeNode(nums[mid]);
    // 递归构建左子树(左区间)
    root.left = auxiliaryFun(nums, start, mid - 1);
    // 递归构建右子树(右区间)
    root.right = auxiliaryFun(nums, mid + 1, end);
    
    return root;
  }

  // 初始调用:整个数组区间 [0, nums.length-1]
  return auxiliaryFun(nums, 0, nums.length - 1);
}

题目来源:力扣(LeetCode)

相关推荐
动词ing14 小时前
【题目练习】算法 组合总和||
算法
陈年老古董14 小时前
Hive 函数学习笔记(下):窗口函数与经典案例
hive·笔记·学习
longlongzihan14 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
专业程序开发源14 小时前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计
Logic10115 小时前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法
yi01115 小时前
LeetCode 643. 子数组最大平均数 I|从暴力枚举到滑动窗口
人工智能·笔记·python·算法·leetcode·滑动窗口
罗西的思考15 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 — (6)— 奖励机制
人工智能·笔记·学习
极光通讯15 小时前
服务器内存来料检验(IQC)实操:批次追溯、外观判定与上机验证
java·服务器·算法
拾饵94216 小时前
第六周第二个项目笔记:FinInsRAG 项目学习笔记(零基础版)以及简历书写
笔记·学习
淡海水16 小时前
02-04-原理篇-GC Roots与对象图遍历
算法·unity·c#·图·gc·遍历·roots