力扣日记1.14-【二叉树篇】108. 将有序数组转换为二叉搜索树

2024-01-14 23:12

本文主要是介绍力扣日记1.14-【二叉树篇】108. 将有序数组转换为二叉搜索树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

力扣日记:【二叉树篇】108. 将有序数组转换为二叉搜索树

日期:2023.1.14
参考:代码随想录、力扣

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

题目描述

难度:简单

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

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

示例 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 按 严格递增 顺序排列

题解

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
#define SOLUTION 2
public:
#if SOLUTION == 1TreeNode* sortedArrayToBST(vector<int>& nums) {if (nums.size() == 0)   return nullptr;// 中节点的位置int index = nums.size() / 2;TreeNode* node = new TreeNode(nums[index]);// 中节点左边和右边的数组分别作为左右子树去构建(左子树为BST + 右子树为BST -> root为BST)// 而且最后一定也是高度平衡二叉树vector<int> leftNum(nums.begin(), nums.begin() + index);    // 左子树:[startIdx, endIdx)vector<int> rightNum(nums.begin() + index + 1, nums.end()); // 右子树node->left = sortedArrayToBST(leftNum); // 左子树(自身也是BST)作为左节点node->right = sortedArrayToBST(rightNum); // 右子树(自身也是BST)作为右节点return node;}
#elif SOLUTION == 2 // 下标索引TreeNode* sortedArrayToBST(vector<int>& nums) {     return buildTree(nums, 0, nums.size() - 1); // 左闭右闭}// 循环不变量,左闭右闭 [left, right]// 返回值为构造的二叉树的根节点,输入为原始数组以及子数组的起始位置TreeNode* buildTree(vector<int>& nums, int left, int right) {// 终止条件if (left - right > 0)   return nullptr; // 相等也是符合条件的,则index = left// 获得子数组的中点位置// int index = (left + right) / 2; // 可能溢出int index = left + (right - left) / 2;TreeNode* node = new TreeNode(nums[index]);// 递归左区间node->left = buildTree(nums, left, index - 1);  // 左闭右闭// 递归右区间node->right = buildTree(nums, index + 1, right);    // 左闭右闭return node;}
#endif
};

复杂度

时间复杂度:
空间复杂度:
在这里插入图片描述

思路总结

  • 构造二叉树本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。
  • 对于二叉搜索树的有序数组,其数组中点即为分割点
  • 注意在构造二叉树的时候尽量不要重新定义左右区间数组,而是用下标来操作原数组(解法一和解法二)。
  • 按照这种方法构造出二叉搜索树,自然而然就是高度平衡二叉树

这篇关于力扣日记1.14-【二叉树篇】108. 将有序数组转换为二叉搜索树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/606841

相关文章

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim