【算法与数据结构】108、LeetCode将有序数组转换为二叉搜索树

news/2024/10/24 2:23:18/

文章目录

  • 一、题目
  • 二、解法
  • 三、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、题目

在这里插入图片描述
在这里插入图片描述

二、解法

  思路分析:这道题给我们的是一个有序数组,并要求构成一个平衡二叉搜索树,二叉搜索树的很容易理解,前几篇文章都做过类似的题目,又是平衡的,平衡就是说每个节点的左右子树高度差不超过1。对于这样一道题,我们可以用二分法将数组分为两个部分,以数组最中间的数为划分区间,这个分出来的两个区间元素个数差不会超过1,用递归的方式不断地划分出两个区间,中间的元素就作为根节点。程序当中我们将中间的元素作为根节点的值,然后用根节点的左右孩子去接收递归的返回值,终止条件又两种情况,一个元素的和两个元素的区间,一个元素的直接返回即可,又因为是有序数组,两个元素的在创建一个节点令它作为根节点的右孩子(二叉搜索树只能作为右孩子)。
  程序如下

class Solution {
public:TreeNode* traversal(vector<int>nums, int begin, int end) {    int middle = (begin + end) / 2;TreeNode* root = new TreeNode(nums[middle]);if ((end - begin) <= 1) {       // 两个元素或者一个元素if ((end - begin) == 1) {   // 两个元素TreeNode* node = new TreeNode(nums[end]);root->right = node;}return root;}root->left = traversal(nums, begin, middle - 1);    // 左子树,[begin, middle-1]左闭右闭       root->right = traversal(nums, middle + 1, end);     // 右子树,[middle+1, end]左闭右闭return root;}TreeNode* sortedArrayToBST(vector<int>& nums) {return traversal(nums, 0, nums.size() - 1);}
};

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

三、完整代码

# include <iostream>
# include <vector>
# include <string>
# include <queue>
using namespace std;// 树节点定义
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 {
public:TreeNode* traversal(vector<int>nums, int begin, int end) {    int middle = (begin + end) / 2;TreeNode* root = new TreeNode(nums[middle]);if ((end - begin) <= 1) {       // 两个元素或者一个元素if ((end - begin) == 1) {   // 两个元素TreeNode* node = new TreeNode(nums[end]);root->right = node;}return root;}root->left = traversal(nums, begin, middle - 1);    // 左子树,[begin, middle-1]左闭右闭       root->right = traversal(nums, middle + 1, end);     // 右子树,[middle+1, end]左闭右闭return root;}TreeNode* sortedArrayToBST(vector<int>& nums) {return traversal(nums, 0, nums.size() - 1);}
};template<typename T>
void my_print(T& v, const string msg)
{cout << msg << endl;for (class T::iterator it = v.begin(); it != v.end(); it++) {cout << *it << ' ';}cout << endl;
}template<class T1, class T2>
void my_print2(T1& v, const string str) {cout << str << endl;for (class T1::iterator vit = v.begin(); vit < v.end(); ++vit) {for (class T2::iterator it = (*vit).begin(); it < (*vit).end(); ++it) {cout << *it << ' ';}cout << endl;}
}// 层序遍历
vector<vector<int>> levelOrder(TreeNode* root) {queue<TreeNode*> que;if (root != NULL) que.push(root);vector<vector<int>> result;while (!que.empty()) {int size = que.size();  // size必须固定, que.size()是不断变化的vector<int> vec;for (int i = 0; i < size; ++i) {TreeNode* node = que.front();que.pop();vec.push_back(node->val);if (node->left) que.push(node->left);if (node->right) que.push(node->right);}result.push_back(vec);}return result;
}int main()
{vector<int> nums = { -10, -3, 0, 5, 9 };my_print(nums, "目标树");Solution s;TreeNode* root = s.sortedArrayToBST(nums);vector<vector<int>> tree = levelOrder(root);my_print2<vector<vector<int>>, vector<int>>(tree, "目标树:");system("pause");return 0;
}

end


http://www.ppmy.cn/news/1114601.html

相关文章

SpringBoot携带Jre绿色部署项目[Linux服务器]

文章目录 SpringBoot携带Jre绿色部署项目[Linux服务器]1. 实现步骤2. 自测成功&#xff0c;如下2-1 环境准备2-2 运行项目 SpringBoot携带Jre绿色部署项目[Linux服务器] 说明&#xff1a; 实际应用的不方便场景&#xff1a;1. 实际项目部属时&#xff0c;现有服务器可能已安装…

ubuntu 配置NTP时间服务器

sudo apt update 显示秒&#xff08;进入Top Bar 打开second&#xff09; sudo apt install gnome-tweaks 安装ntp服务器 sudo apt install ntp 在服务端修改ntp配置开放客户端所在的网段 sudo gedit /etc/ntp.conf restrict 172.19.7.0 mask 255.255.255.0 nomodify notrap 重…

GICv3学习

GICv3学习 参考文档&#xff1a; 《corelink_gic600_generic_interrupt_controller_technical_reference_manual_100336_0106_00_en》 《IHI0069H_gic_architecture_specification》 《ECM0495013B_GIC_Stream_Protocol》 一、GICv3寄存器接口 接口如下图所示&#xff1a…

最全自学黑客技术学习路线~这也泰酷辣

谈起黑客&#xff0c;可能各位都会想到&#xff1a;盗号&#xff0c;其实不尽然&#xff1b;黑客是一群喜爱研究技术的群体&#xff0c;在黑客圈中&#xff0c;一般分为三大圈&#xff1a;娱乐圈 技术圈 职业圈。 娱乐圈&#xff1a;主要是初中生和高中生较多&#xff0c;玩网…

浏览器报错内容:Provisional headers are shown

浏览器报错内容&#xff1a;Provisional headers are shown 如下图&#xff1a; 解决方法&#xff1a;nginx 443 启用HTTP/2模式&#xff0c;如下图&#xff1a; server {listen 443 ssl http2;server_name callcenterda.umworks.com;client_max_body_size 200M;ssl_session_…

Cesium与Threejs融合

融合demo 一、简介 将Cesium与three.js进行融合,从而是3d具备大场景GIS能力,使GIS具备3d能力。 关键步骤如下: 1、局部坐标系定义和坐标转换 2、相机同步 3、事件同步 二、代码 <script setup lang="ts"> import { onMounted } from vue import @ano…

JSP ssm 网上求职管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP ssm 网上求职管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采…

企业架构LNMP学习笔记60

Tomcat企业常见使用方法&#xff1b; 1&#xff09;简单代码测试&#xff1a; 将两个jsp文件上传到ROOT目录下。 查看下这个jsp代码&#xff1a; test.jsp <html> <head><title>Hello World</title> <% page language"java" contentT…