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

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

题目链接:

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

大概思路:

题目要求:

给一个升序数组,把它转化为高度平衡二叉搜索树。

高度平衡二叉树:

一个节点的左右子树高度差一定不超过1。

思路:

取数组中间作为分割点,然后划分左右区间,然后再取左右区间的中间节点作为分割点,然后继续划分下去,不断循环,直至二叉搜索树构造完成

数组构造二叉搜索树,用中间节点不断划分的话,那必然是平衡树,脑补下过程,最大差最多一颗树

递归三部曲:

1.确定递归函数参数和返回类型:

划分区间是闭区间[left, right],参数为数组,左右区间的数值

TreeNode* traversal(vector<int>& nums, int left, int right) {

2.明确终止条件:

当函数构造到函数最后一个节点,此时没有再按mid划分区间的话,+-1会让这个条件达成

if (left > right) return nullptr;

3.确定递归单层逻辑:

取数组中间的值,然后构造新节点返回,同时以这个数值中间值为分割点,划分左右区间,最后返回该节点

//可以避免两个节点值加起来突破内存上限的同时,
//也可以让数组长度为偶数的时候,取中间靠左的数组作为中间节点
int mid = left + ((right - left) / 2);

TreeNode* root = new TreeNode(nums[mid]);
root->left = traversal(nums, left, mid - 1);
root->right = traversal(nums, mid + 1, right);
return root;

4.总代码:      

class Solution {
private:
    TreeNode* traversal(vector<int>& nums, int left, int right) {
        if (left > right) return nullptr;
        int mid = left + ((right - left) / 2);
        TreeNode* root = new TreeNode(nums[mid]);
        root->left = traversal(nums, left, mid - 1);
        root->right = traversal(nums, mid + 1, right);
        return root;
    }
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        TreeNode* root = traversal(nums, 0, nums.size() - 1);
        return root;
    }
};

 

相关文章:

  • 第五届传智杯-初赛【B组-题解】
  • 最全面的SpringMVC教程(一)——SpringMVC简介
  • OpenCV-Python小应用(六):车道线检测
  • 微信小程序介绍
  • matlab实现MCMC的马尔可夫转换MS- ARMA - GARCH模型估计
  • 华为云桌面Workspace,让你的办公更加舒适惬意
  • 基于优先级的时间片轮转调度算法(C语言实现)
  • 43特征01——特征值特征向量: 特征多项式、特殊矩阵 的特征值与特征向量、Hamilton-Cayley 定理
  • [毕业设计]机器学习的运动目标跟踪-opencv
  • Ubuntu 软件管理学习笔记
  • python中pytest库用法详解
  • CSRF漏洞简介
  • C/C++航空客运订票系统
  • 编译原理之词法分析器随笔和简单实现
  • 47 - 父子间的冲突
  • Consul Config 使用Git做版本控制的实现
  • CSS 三角实现
  • download使用浅析
  • java8 Stream Pipelines 浅析
  • js继承的实现方法
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • October CMS - 快速入门 9 Images And Galleries
  • php面试题 汇集2
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • swift基础之_对象 实例方法 对象方法。
  • Vultr 教程目录
  • Webpack 4x 之路 ( 四 )
  • Yii源码解读-服务定位器(Service Locator)
  • 那些年我们用过的显示性能指标
  • 强力优化Rancher k8s中国区的使用体验
  • 转载:[译] 内容加速黑科技趣谈
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 通过调用文摘列表API获取文摘
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #{}和${}的区别?
  • $.ajax,axios,fetch三种ajax请求的区别
  • (二)PySpark3:SparkSQL编程
  • ./configure,make,make install的作用
  • .equals()到底是什么意思?
  • .form文件_一篇文章学会文件上传
  • .Net CF下精确的计时器
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .NET中两种OCR方式对比
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • [2544]最短路 (两种算法)(HDU)
  • [C puzzle book] types
  • [GPT]Andrej Karpathy微软Build大会GPT演讲(上)--GPT如何训练
  • [HarmonyOS]第一课:从简单的页面开始
  • [Head First设计模式]策略模式
  • [hihocoder1395] 最大权闭合子图
  • [IE6 only]关于Flash/Flex,返回数据产生流错误Error #2032的解决方式
  • [iOS]如何删除工程里面用cocoapods导入的第三方库