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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

原题

  • 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
  • 通上一篇中一样,平衡二叉树,高度差不超过1,其实就是AVL树

分析

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

  • 对AVl树的构建实现以及原理在之前的文章 数据结构与算法–面试必问AVL树原理及实现 有做详细的分析
  • 算法分析:
    • 同上篇中思路,因为是顺序链表,并且要求平衡二叉树,那么左右节点数一样,链表中间节点middle就是树的根
    • head节点到middle是leftTree, middle节点到Tail是rightTree
    • 同样对于左子树,右子树,也依据第一步骤中,取中间节点作为根,分别得出对应的树结构
    • 如上,中间节点查找我们可以用快慢指针,fast每次2步,slow每次一步,得到的slow就是中间节点
    • 首先我们对head~ ail(此时tail可以用null代替,最后节点就是null节点),得到中间节点slow,并且构建根slowNode
    • 接着我们分别对head ~ slow ,slow.next ~ tail分别求中间节点并且构建对应的树节点,依次递归每个左右子树

算法实现

  • 实现中所有的链表节点ListNode, 树节点BinaryNode的实现均出自自己的算法实现在之前的文章中有详细的实现分析。
/*** @author liaojiamin* @Date:Created in 14:31 2022/2/22*/
public class ConverListToBinary {public static void main(String[] args) {ListNode listNode = new ListNode("i", 1);for (int i = 6; i < 26; i++) {MyLinkedList.addToTail(listNode, i + "_"+ i, i);}ListNode head = listNode;ListNode headNext = listNode.getNext();while (headNext != null){headNext.setBefore(head);head = headNext;headNext = headNext.getNext();}BinaryNode binaryNode = buildTree(listNode, null);BinarySearchTree binarySearchTree = new BinarySearchTree();binarySearchTree.printTree(binaryNode);}public static BinaryNode buildTree(ListNode listNode, ListNode tail){if(listNode == tail){return null;}ListNode slow = listNode;ListNode fast = listNode;while (fast != tail && fast.getNext() != tail){fast = fast.getNext().getNext();slow = slow.getNext();}BinaryNode binaryNode = new BinaryNode(slow.getValue(), null, null);binaryNode.setLeft(buildTree(listNode, slow));binaryNode.setRight(buildTree(slow.getNext(), tail));return binaryNode;}
}

上一篇:数据结构与算法–力扣108题将有序数组转换为二叉搜索树

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

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

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

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

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

  3. [Leetcode][第109题][JAVA][有序链表转换二叉搜索树][分治][快慢指针][中序遍历]

    [问题描述][中等] [解答思路] 1. 分治 快慢指针 复杂度 class Solution {public TreeNode sortedListToBST(ListNode head) {ret ...

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

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

  5. [leetcode-108,109] 将有序数组转换为二叉搜索树

    109. 有序链表转换二叉搜索树 Given a singly linked list where elements are sorted in ascending order, convert it ...

  6. 【数据结构和算法笔记】用c和c++分别实现二叉搜索树

    目录 二叉排序树(二叉搜索树)定义: 二叉排序树的性质: 二叉排序树的操作: c语言实现二叉排序树: C++实现二叉排序树: 二叉排序树(二叉搜索树)定义:    二叉排序树的性质: (1)二叉排序树 ...

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

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

  8. LeetCode(109):有序链表转换二叉搜索树

    Medium! 题目描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: ...

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

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

最新文章

  1. 聊一聊跨域,Vue向Django请求数据的一些问题
  2. wifi linux 驱动分析,Linux 下wifi 驱动开发(二)—— WiFi模块浅析
  3. 从HTML5移动应用现状谈发展趋势
  4. Y分钟学clojure
  5. Spring 自动装配 ‘byType’
  6. 计算机主机组成实验,计算机组成原理实验-运算器组成实验报告
  7. C#获取文件夹及文件的大小与占用空间的方法
  8. 黄聪:Discuz X2.0 SEO:论坛面包屑导航伪静态 去掉面包屑导航forum.php(转)
  9. Orchard是如何工作的?
  10. layui按条件开启关闭编辑列
  11. 简单的路由封装ppp
  12. fisco bcos DagTransferUser.java 源码解析阅读注释
  13. 现代操作系统(原书第四版)课后题答案 —— 第一章 引论
  14. Demo3D详解-----附下载地址
  15. vue + element插件Popover弹出框
  16. 腾讯云数据迁移工具解决方案:华为云迁移到腾讯云
  17. 微信企业号开发-如何建立连接
  18. C语言32位系统下基本类型数据所占字节数
  19. 怎么把虚拟机的计算机弄到桌面,Win10自带的虚拟机功能,教你这样设置,免费让一台电脑变3台!...
  20. 需求分析师如何提高核心竞争力

热门文章

  1. 剑指offer之中判断二叉树是不是对称二叉树(递归和非递归实现)
  2. 其实python面向对象3分钟就可以入门(14)
  3. sql CHECK ,UNIQUE 约束(mysql)
  4. pythonweb服务器怎么让别人访问_Django配置让其他电脑访问网站
  5. php 点对点,浅析点对点(End-to-End)的场景文字识别
  6. hutol json null值没了_JSON数据处理框架Jackson精解第一篇-序列化与反序列化核心用法...
  7. 用柠檬来发电真的可行吗?
  8. 【汇总推荐】深度学习、自然语言处理干货笔记汇总
  9. 绘制矩形php,PHP_php绘制一个矩形的方法,本文实例讲述了php绘制一个矩 - phpStudy...
  10. ajax 偶尔302,关于Ajax 中response出现302的一点见解