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

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

思路一:在数据结构中,我们曾经学到过这样一个东西:二分搜索树(不是BST),这个树是根据二分搜索的搜索顺序而画出来的树。这棵树的特点就是它是绝对平衡的,并且是有序的。既然我们可以根据二分搜索的顺序来构建平衡二叉搜索树,那么我们就可以将原数组排成二分搜索此数组的顺序,这里用了集合容器作为额外空间存储。至于二分搜索的顺序模拟,是根据分冶来的。

然后就是树的构建,是数据结构的基础。注意:我们在写树的创建函数时,一定要返回一个值,因为我们的结点在创建以后并不会归到树中,需要我们人为的赋给这个空指针结点才行,不然会不存在。

这一种思路写起来其实挺麻烦的,但是思路很清晰。另外就是因为作者认为,这棵树需要实时是平衡二叉树才行,刚开始还把思路向着旋转那里去想了,结果手写特别麻烦,就没有采用那种思路。后来发现只要构建的树最后是平衡的就行,而不需要在创建的时候就一步一步都得是平衡树。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {List<Integer>list=new ArrayList<>();public TreeNode sortedArrayToBST(int[] nums) {if(nums.length<=0)return null;finds(nums);TreeNode root=new TreeNode(nums[nums.length/2],null,null);if(nums.length!=2){        for(int i=1;i<list.size();i++){create(root,list.get(i));}return root;}else{for(int i=0;i<list.size();i++){create(root,list.get(i));}return root;}}public void finds(int []nums){if(nums.length<=0)return;if(nums.length==1){list.add(nums[0]);return;}if(nums.length==2){list.add(nums[0]);list.add(nums[1]);return;}list.add(nums[nums.length/2]);int []left=new int[nums.length/2];int []right=new int[nums.length-nums.length/2-1];for(int i=0;i<nums.length/2;i++){left[i]=nums[i];}int k=0;for(int i=nums.length/2+1;i<nums.length;i++){right[k++]=nums[i];}finds(left);finds(right);}public TreeNode create(TreeNode root,int val){if(root==null){TreeNode tmp=new TreeNode(val,null,null);return tmp;}if(root.val>val){root.left=create(root.left,val);}else if(root.val<val){root.right=create(root.right,val);}return root;}
}

思路二:因为二叉搜索树的中序遍历正是一个升序的序列,所以我们可以任取一个结点,它的左边就是左子树,右边就是右子树。但又因为需要平衡,所以我们选择中间结点作为根,这样可以保证左右结点平衡,可以通过分冶递归实现。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode sortedArrayToBST(int[] nums) {return fenye(nums,0,nums.length-1);}public TreeNode fenye(int []nums,int l,int r){if(l>r)return null;int mid=l+(r-l)/2;TreeNode root=new TreeNode(nums[mid]);root.left=fenye(nums,l,mid-1);root.right=fenye(nums,mid+1,r);return root;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • word文档无损原样转pdf在windows平台使用python调用win32com使用pip安装pywin32
  • 嵌入式epoll面试题面试题及参考答案
  • Maven私服Nexus安装及使用
  • 第7篇:【系统分析师】计算机网络
  • openCV的python频率域滤波
  • 从底层原理上理解ClickHouse 中的 Distributed 引擎
  • 第四届长城杯部分wp
  • 【C++题解】1398. 奇偶统计
  • 依据出生人数预测高等教育发展趋势
  • [项目][WebServer][解析错误处理]详细讲解
  • 2024年上半年互联网黑灰产研究报告
  • qt操作excel(QAxObject详细介绍)
  • 1992-2022年各省市县夜间灯光数据(excel+shp格式)
  • react 组件通讯
  • Xcode报错:Return from initializer without initializing all stored properties
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 「面试题」如何实现一个圣杯布局?
  • CentOS7简单部署NFS
  • Elasticsearch 参考指南(升级前重新索引)
  • es6--symbol
  • Java,console输出实时的转向GUI textbox
  • Javascript 原型链
  • node和express搭建代理服务器(源码)
  • Python学习笔记 字符串拼接
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 前端性能优化——回流与重绘
  • 全栈开发——Linux
  • 三栏布局总结
  • 探索 JS 中的模块化
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 推荐一个React的管理后台框架
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • kubernetes资源对象--ingress
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • #define 用法
  • #在 README.md 中生成项目目录结构
  • (二)linux使用docker容器运行mysql
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (四)图像的%2线性拉伸
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (学习日记)2024.01.09
  • (一)Docker基本介绍
  • (原創) 物件導向與老子思想 (OO)
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)shell调试方法
  • .“空心村”成因分析及解决对策122344
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .netcore如何运行环境安装到Linux服务器
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • .NET实现之(自动更新)
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件