当前位置: 首页 > news >正文

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

一、题目内容

给你一个整数数组 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] 都是高度平衡二叉搜索树。

二、源代码(部分)

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
struct TreeNode* helper(int* nums, int left, int right) {if (left > right) {return NULL;}// 总是选择中间位置左边的数字作为根节点int mid = (left + right) / 2;struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));root->val = nums[mid];root->left = helper(nums, left, mid - 1);root->right = helper(nums, mid + 1, right);return root;
}struct TreeNode* sortedArrayToBST(int* nums, int numsSize) {return helper(nums, 0, numsSize - 1);
}

三、题目解析

  1. 递归边界处理:定义辅助函数helper,接收数组nums、左边界left和右边界right。当left > right时(子数组为空),返回NULL,表示当前子树为空。

  2. 选择根节点:对于非空子数组(left ≤ right),计算中间索引mid = (left + right) / 2,选择nums[mid]作为当前子树的根节点。这一选择保证了左右子树的节点数量尽可能均衡,为构建平衡树奠定基础。

  3. 递归构建左右子树

    • 左子树由原数组中[left, mid-1]范围内的元素构成,通过helper(nums, left, mid-1)递归构建。
    • 右子树由原数组中[mid+1, right]范围内的元素构成,通过helper(nums, mid+1, right)递归构建。
  4. 返回根节点:最终构建的树的根节点由helper(nums, 0, numsSize-1)返回,即整个数组对应的平衡 BST。

四、实验总结

  1. 算法正确性

    • 满足二叉搜索树性质:由于数组升序,左子树元素([left, mid-1])均小于根节点nums[mid],右子树元素([mid+1, right])均大于根节点,符合 BST 的左小右大特性。
    • 满足平衡树性质:每次选择中间元素作为根节点,确保左右子树的节点数量差不超过 1,因此整棵树的高度差不会超过 1,是高度平衡的。
  2. 时间复杂度:O (n),其中 n 是数组长度。每个元素会被访问一次(作为根节点),递归过程中没有重复计算,因此时间复杂度与数组长度成正比。

  3. 空间复杂度:O (logn)(不考虑输出树的空间)。递归调用的栈深度取决于树的高度,由于是平衡树,高度为 logn,因此栈空间复杂度为 O (logn)。若考虑输出树的存储空间,则为 O (n)(需存储 n 个节点)。

  4. 特点与扩展

    • 该实现选择中间偏左的元素作为根节点(mid = (left + right) / 2),若选择中间偏右的元素(如mid = (left + right + 1) / 2),也可构建平衡 BST,结果可能不同但均满足要求。
    • 对于升序数组,转换为平衡 BST 的结果不唯一,但该方法是最直接且高效的实现方式。
http://www.dtcms.com/a/529820.html

相关文章:

  • 长春做网站公司长春seo公司网页设计师培训费用图片
  • 外贸网站 源wordpress rpc
  • 深圳建站服务中心火车头采集器和wordpress
  • 志愿者网站建设500万在北京几环买房
  • linux如何将运行进程设置为权限最高进程 当资源不足时,避免被内核kill掉
  • Windows环境变量终极指南
  • 我要学做网站seo优化是做什么的
  • 齐齐哈尔网站seo淄博网站制作首选专家
  • 向google提交网站微信抽奖小程序怎么做
  • 西安网站挂标广西金利建设有限公司网站
  • windows10安装WSL2 ubuntu24.04中安装vLLM vLLM中部署Qwen2.5-VL
  • 如何在Linux(Ubuntu)操作系统上查看文件的MD5,SHA256等校验码
  • 网站付的保证金怎么做会计凭证山东公司网站建设
  • 商城网站建设企业lamp 搭建wordpress
  • 做网站对企业有什么好处2022年网站能用的
  • 邯郸推广网站建设哪个好桐乡市城乡规划建设局网站
  • 布吉网站的建设中国菲律宾最新局势
  • 青海电商网站建设公司中国十大最著名品牌
  • ML 与 DL 常用数据集介绍
  • 佛山网站建设公司怎么样石家庄网站建设远策科技
  • 厦门u 网站建设如何选择昆明网站建设
  • 做网站生意多吗a5站长平台
  • 网站开发企业一级a做爰片免费网站孕交视频
  • 旅游网站设计规划书做视频网站视频用什么插件吗
  • 继承Thread类
  • 福建城建设厅官方网站昆山高端网站设计公司
  • 呼市网站seo优化工资提成怎么算邙山郑州网站建设
  • 【C++】开发环境配置
  • 百度下载软件太慢了怎么办
  • 【Windows】关于搜狗浏览器安装11、12版本-区别