力扣108提将有序数组转换为二叉搜索树

  • 近一年都比较关注算法相关的知识,也刷了不少题,之前的文章中大多也是算法相关的文章,但是感觉每次遇到树相关的题型都不能应对自如,因此还是有必要在相关知识上下功夫,因此有此次总结,以下是所有树相关的文章

数据结构与算法–面试必问AVL树原理及实现

数据结构与算法–二叉树的深度问题

数据结构与算法–二叉堆(最大堆,最小堆)实现及原理

数据结构与算法–二叉查找树转顺序排列双向链表

数据结构与算法-- 二叉树中和为某一值的路径

数据结构与算法-- 二叉树后续遍历序列校验

数据结构与算法-- 广度优先打印二叉树

数据结构与算法–解决问题的方法- 二叉树的的镜像

数据结构与算法–重建二叉树

数据结构与算法–二叉查找树实现原理

数据结构与算法–二叉树实现原理

数据结构与算法–B树原理及实现

数据结构与算法–数字在排序数组中出现次数

数据结构与算法–死磕二叉树

数据结构与算法–二叉树第k个大的节点

数据结构与算法–力扣108提将有序数组转换为二叉搜索树

原题:

  • 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
  • 如下图所示:

解析

  • 如上题意,高度平衡二叉查找树,并且高度差不超过1,这正好符合AVL树的定义
  • AVL(Adelson-Velskii 和landis)树是带有平衡条件的二叉查找树,这个平衡条件必须容易实现,并且保证树的深度必须是O(logN)。因此我们让一棵AVL树中每个节点的左子树和右子树的高度最多相差1(空树高度定义-1)如下图,左边是AVL树,右边不是AVL树。

  • 对AVl树的构建实现以及原理在之前的文章 数据结构与算法–面试必问AVL树原理及实现 有做详细的分析

  • 算法分析如下:

    • 关键点一 升序 排列 的数组
    • 关键点二,AVL树(左子树小于根,右子树大于根,高度差小于1)
    • 根据如上两个关键信息,要得到一颗AVL树,我们需要根的左右子树节点一样,或者相差1
    • 根据AVL树的特性,左小右大,那么我们选取数组第中间大的数据作为根节点
    • 因为是升序排序,那么0~length/2 就是左子树,length/2 +1 ~ length就是右子树
    • 同样的道理,对应左子树中也可以同样看成是一颗AVL树,对于右子树同样看成hi一颗AVL树,得出一个递归的构建过程

算法实现

/*** 有序数组转换为高度平衡二叉搜索树(AVL树)* @author liaojiamin* @Date:Created in 16:34 2022/2/21*/
public class SortArrayToAvlTree {public static void main(String[] args) {int[] arr = new int[20];Random random = new Random();for (int i = 0; i < 20; i++) {if(i == 0){arr[i] = random.nextInt(30);}else {arr[i] = random.nextInt(30) + arr[i-1];}System.out.print(arr[i] + ",");}System.out.println();BinaryNode avlTree = sortArrayToAVL(arr);printTreeMiddle(avlTree);}/*** 中序遍历* */public static void printTreeMiddle(BinaryNode binaryNode){if(binaryNode == null){return;}printTreeMiddle(binaryNode.getLeft());System.out.println(binaryNode.getElement());printTreeMiddle(binaryNode.getRight());}/*** 有序数组递归构建AVL树* */public static BinaryNode sortArrayToAVL(int[] arr){if(arr == null || arr.length == 0){return null;}if(arr.length == 1){return new BinaryNode(arr[0], null, null);}BinaryNode leftNode = sortArrayToAVL(Arrays.copyOfRange(arr, 0, (arr.length/2)));BinaryNode rightNode = sortArrayToAVL(Arrays.copyOfRange(arr, (arr.length/2)+1,arr.length));BinaryNode rootNode = new BinaryNode(arr[arr.length/2], leftNode, rightNode);return rootNode;}
}

上一篇:数据结构与算法一篇帮助你吃下KMP算法

数据结构与算法--力扣108题将有序数组转换为二叉搜索树相关推荐

  1. 数据结构与算法--力扣109题将有序双向链表转换为二叉搜索树

    将有序数组转换为二叉搜索树 近一年都比较关注算法相关的知识,也刷了不少题,之前的文章中大多也是算法相关的文章,但是感觉每次遇到树相关的题型都不能应对自如,因此还是有必要在相关知识上下功夫,因此有此次总 ...

  2. 【数据结构与算法】之深入解析“将有序数组转换为二叉搜索树”的求解思路与算法示例

    一.题目要求 给你一个整数数组 nums ,其中元素已经按升序排列,请你将其转换为一棵高度平衡 二叉搜索树. 高度平衡二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树. ...

  3. laravel数组转换为字符串_LeetCode刷题实战108:将有序数组转换为二叉搜索树

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  4. ★LeetCode(108)——将有序数组转换为二叉搜索树(JavaScript)

    将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0, ...

  5. leetcode刷题记录--数据结构;深度优先搜索算法;二叉树;平衡树;1020. 飞地的数量;1669. 合并两个链表;108. 将有序数组转换为二叉搜索树

    1020. 飞地的数量 难度中等131 给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格.1 表示一个陆地单元格. 一次 移动 是指从一个陆地单元格走到另一个相邻(上 ...

  6. 将字符串转换为数组_LeetCode 树 108.将有序数组转换为二叉搜索树

    7(108) 将有序数组转换为二叉搜索树 描述 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 ...

  7. Suzy找到实习了吗 Day23 | 二叉树最后一节!669. 修剪二叉搜索树,108. 将有序数组转换为二叉搜索树,538. 把二叉搜索树转换为累加树

    669. 修剪二叉搜索树 题目 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high.通过修剪二叉搜索树,使得所有节点的值在[low, high]中.修剪树 不应该 改变保 ...

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

    将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0, ...

  9. [Leetcode][第108题][JAVA][将有序数组转换为二叉搜索树][二分法][递归]

    [问题描述][简单] 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树.本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1.示例:给定有序数组: [- ...

最新文章

  1. NHIBERNATE
  2. DAS工具: 利用去重、聚合和评分的策略从宏基因组中恢复基因组
  3. 微信小程序-01-项目组成文件介绍(入门篇)
  4. 3 - SQL Server 2008 之 使用SQL语句删除约束条件
  5. Jenkins系列——使用Dashboard View分类展示作业
  6. 《JavaScript高级程序设计》红宝书第二遍阅读(动手实践)
  7. 疯狂Java讲义笔记汇总
  8. html 右边是iframe 左右结构_HTML iframe 用法总结收藏
  9. word方框(□)中打钩(√)的3种方法
  10. Python画好看的星空图
  11. 可能是最好的设计模式入门教程——里氏替换原则
  12. 基于JAVA景区售票系统设计与实现 开题报告
  13. Python批量获取手机号码归属地(图文展示)
  14. 微信小程序如何修改单页面背景色
  15. MATLAB绘制雷达图并导出矢量图到Visio编辑(论文用图)
  16. 使用C++枚举WINDOWS计划任务-使用管理员启动获取全计划任务,否则获取部分计划任务
  17. JS gkb转utf8(fetch gbk网页是乱码)
  18. E-PUCK机器人-FAQ
  19. BIOS知识枝桠——文件系统
  20. position中absolute和fixed的区别

热门文章

  1. linux之 !!命令
  2. Android之如何判断设备是平板还是手机
  3. C++编译出现binding ‘const string {aka const std::__cxx11::basic_string<char>}’ to reference of type ‘std
  4. Hibernate懒加载
  5. 无代码iVX编程实现简单魂斗罗
  6. python process 函数_Python Process创建进程的2种方法详解
  7. 快要“成精”的波士顿机械狗,开始卖了,价格不贵准备搞一只
  8. 怪咖发明家,乔布斯给了他四亿,他没要,转身靠发明救了10亿人。
  9. php post api json数据,php – REST API:请求身份为JSON或纯POST数据?
  10. 法斗几个月长鼻筋_聊一下足底筋膜炎治疗经历