[Leetcode][第108题][JAVA][将有序数组转换为二叉搜索树][二分法][递归]
【问题描述】[简单]
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:0/ \-3 9/ /-10 5
【解答思路】
时间复杂度:O(N) 空间复杂度:O(logN)
1. 中序遍历,总是选择中间位置左边的数字作为根节点
class Solution {public TreeNode sortedArrayToBST(int[] nums) {return helper(nums, 0, nums.length - 1);}public TreeNode helper(int[] nums, int left, int right) {if (left > right) {return null;}// 总是选择中间位置左边的数字作为根节点int mid = (left + right) / 2;TreeNode root = new TreeNode(nums[mid]);root.left = helper(nums, left, mid - 1);root.right = helper(nums, mid + 1, right);return root;}
}
2. 中序遍历,总是选择中间位置右边的数字作为根节点
class Solution {public TreeNode sortedArrayToBST(int[] nums) {return helper(nums, 0, nums.length - 1);}public TreeNode helper(int[] nums, int left, int right) {if (left > right) {return null;}// 总是选择中间位置右边的数字作为根节点int mid = (left + right + 1) / 2;TreeNode root = new TreeNode(nums[mid]);root.left = helper(nums, left, mid - 1);root.right = helper(nums, mid + 1, right);return root;}
}
3. 中序遍历,选择任意一个中间位置数字作为根节点
class Solution {Random rand = new Random();public TreeNode sortedArrayToBST(int[] nums) {return helper(nums, 0, nums.length - 1);}public TreeNode helper(int[] nums, int left, int right) {if (left > right) {return null;}// 选择任意一个中间位置数字作为根节点int mid = (left + right + rand.nextInt(2)) / 2;TreeNode root = new TreeNode(nums[mid]);root.left = helper(nums, left, mid - 1);root.right = helper(nums, mid + 1, right);return root;}
}
【总结】
1.二叉搜索树的中序遍历是升序序列
2.给定二叉搜索树的中序遍历,不能唯一地确定二叉搜索树
3.多画图 找规律 遍历所有情况
转载链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/solution/jiang-you-xu-shu-zu-zhuan-huan-wei-er-cha-sou-s-33/
[Leetcode][第108题][JAVA][将有序数组转换为二叉搜索树][二分法][递归]相关推荐
- leetcode刷题记录--数据结构;深度优先搜索算法;二叉树;平衡树;1020. 飞地的数量;1669. 合并两个链表;108. 将有序数组转换为二叉搜索树
1020. 飞地的数量 难度中等131 给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格.1 表示一个陆地单元格. 一次 移动 是指从一个陆地单元格走到另一个相邻(上 ...
- 数据结构与算法--力扣108题将有序数组转换为二叉搜索树
力扣108提将有序数组转换为二叉搜索树 近一年都比较关注算法相关的知识,也刷了不少题,之前的文章中大多也是算法相关的文章,但是感觉每次遇到树相关的题型都不能应对自如,因此还是有必要在相关知识上下功夫, ...
- laravel数组转换为字符串_LeetCode刷题实战108:将有序数组转换为二叉搜索树
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...
- 【LeetCode每日一题】——109.有序链表转换二叉搜索树
文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[题目提示] 七[解题思路] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 二叉树 二[题 ...
- 将字符串转换为数组_LeetCode 树 108.将有序数组转换为二叉搜索树
7(108) 将有序数组转换为二叉搜索树 描述 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 ...
- Suzy找到实习了吗 Day23 | 二叉树最后一节!669. 修剪二叉搜索树,108. 将有序数组转换为二叉搜索树,538. 把二叉搜索树转换为累加树
669. 修剪二叉搜索树 题目 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high.通过修剪二叉搜索树,使得所有节点的值在[low, high]中.修剪树 不应该 改变保 ...
- 20190917:(leetcode习题)将有序数组转换为二叉搜索树
将有序数组转换为二叉搜索树 题目 大致思路 代码实现 题目 大致思路 将有序数组转换为二叉平衡树,即左边的数和右边数的差值不超过1,那么root节点应该为正中间的数,然后左边的剩余的中间为root.l ...
- LeetCode(Python)—— 将有序数组转换为二叉搜索树(简单)
将有序数组转换为二叉搜索树 概述:给你一个整数数组 nums ,其中元素已经按升序排列,请你将其转换为一棵高度平衡二叉搜索树.高度平衡二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 ...
- [leetcode-108,109] 将有序数组转换为二叉搜索树
109. 有序链表转换二叉搜索树 Given a singly linked list where elements are sorted in ascending order, convert it ...
最新文章
- 表单系列之input number总结
- iText in Action 2nd4.2节(Changing the properties of a cell)读书笔记
- android 4.2 判断桌面快捷,Android 判断桌面是否快捷方式,不存在则创建
- mongoclient php扩展,lnmp安装mongo扩展后,在实例化mongoClient()时出错
- 【英语学习】【Daily English】U14 Transportation L04 I'm going to go screen
- PostgreSQL与mysql语法不同
- with temp as 使用
- 用acts_as_paranoid 做假删除
- 墨画子卿第三章第8节:第三元素
- css hr标签 各种样式
- 11. 符号和符号解析
- C语言 - 巧解正数,负数以及零的按位取反
- python 输入一个数,判断是不是水仙花数
- 用java编写博弈树_MathorCup竞赛优秀论文基于MonteCarlo局面评估和UCT博弈树搜索的...
- 思科学院cisco-基本网络连接和通信
- 通过引用关系构建药物-症状-疾病三元组挖掘隐含的药物-疾病关系
- Win32下利用_beginthread函数创建一个线程
- opencv python书籍_OpenCV算法精解:基于Python与C++
- matlab离散信号的绘制
- IE-LAB:5G将增强Wi-Fi,而不是取代它
热门文章
- Web开发入门疑问收集(不定期更新)
- .net core学习
- 字符串拼接成insert语句[简单记录]
- PHPUnit安装、用法、测试(三)
- 注册和登录还有那个加密的密码
- 禁用linux系统日志,KB4532432-如果在 Linux 系统上禁用了 IPV6,则会议将失败
- 小强升职记梗概_时间管理法 ——《小强升职记》读书笔记 1
- apache phoenix 入门_实现Phoenix入门
- mysql数据库及应用_mysql数据库介绍及应用
- vue获取浏览器地址栏参数(?及/)路由+非路由实现方式