给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定的有序链表: [-10, -3, 0, 5, 9],

一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:

0
      / \
    -3   9
    /   /
  -10  5

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree

思路:

按照升序排列的单链表,我们只需要找到他的中间结点,让他成为树的根节点,中间结点前面的就是根节点左子树的所有节点,中间节点后面的就是根节点右子树的所有节点,然后使用递归的方式再分别对左右子树进行相同的操作

代码如下

  1. public class Test01 {
  2. public static void main(String[] args) {
  3. ListNode head = new ListNode(-10);
  4. ListNode listNode1 = new ListNode(-3);
  5. ListNode listNode2 = new ListNode(0);
  6. ListNode listNode3 = new ListNode(5);
  7. ListNode listNode4 = new ListNode(9);
  8.  
  9. head.next = listNode1;
  10. listNode1.next = listNode2;
  11. listNode2.next = listNode3;
  12. listNode3.next = listNode4;
  13.  
  14. TreeNode1 treeNode1 = Solution.sortedListToBST(head);
  15.  
  16. System.out.println(treeNode1);
  17. }
  18. }
  19.  
  20. //Definition for singly-linked list.
  21. class ListNode {
  22. int val;
  23. ListNode next;
  24.  
  25. ListNode() {
  26. }
  27.  
  28. ListNode(int val) {
  29. this.val = val;
  30. }
  31.  
  32. ListNode(int val, ListNode next) {
  33. this.val = val;
  34. this.next = next;
  35. }
  36. }
  37.  
  38. // * Definition for a binary tree node.
  39. class TreeNode1 {
  40. int val;
  41. TreeNode1 left;
  42. TreeNode1 right;
  43.  
  44. TreeNode1() {
  45. }
  46.  
  47. TreeNode1(int val) {
  48. this.val = val;
  49. }
  50.  
  51. TreeNode1(int val, TreeNode1 left, TreeNode1 right) {
  52. this.val = val;
  53. this.left = left;
  54. this.right = right;
  55. }
  56. }
  57.  
  58. class Solution {
  59. public static TreeNode1 sortedListToBST(ListNode head) {
  60. //边界条件的判断
  61. if (head == null)
  62. return null;
  63. if (head.next == null)
  64. return new TreeNode1(head.val);
  65. //这里通过快慢指针找到链表的中间结点slow,pre就是中间
  66. //结点slow的前一个结点
  67. ListNode slow = head, fast = head, pre = null;
  68. while (fast != null && fast.next != null) {
  69. pre = slow;
  70. slow = slow.next;
  71. fast = fast.next.next;
  72. }
  73. //链表断开为两部分,一部分是node的左子节点,一部分是node
  74. //的右子节点
  75. pre.next = null;
  76. //node就是当前节点
  77. TreeNode1 node = new TreeNode1(slow.val);
  78. //从head节点到pre节点是node左子树的节点
  79. node.left = sortedListToBST(head);
  80. //从slow.next到链表的末尾是node的右子树的结点
  81. node.right = sortedListToBST(slow.next);
  82. return node;
  83. }
  84. }

LeetCode刷题日记 2020/08/18的更多相关文章

  1. Leetcode | 刷题日记(1)

    本文记录个人刷题记录 推荐两个刷题网站: 地址:https://leetcode.com/ 另外一个地址:http://www.lintcode.com/ 1.Write a SQL query to ...

  2. LeetCode刷题专栏第一篇--思维导图&时间安排

    昨天是元宵节,过完元宵节相当于这个年正式过完了.不知道大家有没有投入继续投入紧张的学习工作中.年前我想开一个Leetcode刷题专栏,于是发了一个投票想了解大家的需求征集意见.投票于2019年2月1日 ...

  3. LeetCode刷题总结-树篇(上)

          引子:刷题的过程可能是枯燥的,但程序员们的日常确不乏趣味.分享一则LeetCode上名为<打家劫舍 |||>题目的评论: 如有兴趣可以从此题为起点,去LeetCode开启刷题之 ...

  4. C#LeetCode刷题-动态规划

    动态规划篇 # 题名 刷题 通过率 难度 5 最长回文子串   22.4% 中等 10 正则表达式匹配   18.8% 困难 32 最长有效括号   23.3% 困难 44 通配符匹配   17.7% ...

  5. C#LeetCode刷题-字符串

    字符串篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串   24.6% 中等 5 最长回文子串   22.4% 中等 6 Z字形变换   35.8% 中等 8 字符串转整数 (atoi)   ...

  6. C#LeetCode刷题-双指针

    双指针篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串   24.5% 中等 11 盛最多水的容器   43.5% 中等 15 三数之和   16.1% 中等 16 最接近的三数之和   3 ...

  7. C#LeetCode刷题-数组

    数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...

  8. C#LeetCode刷题-哈希表

    哈希表篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 42.8% 简单 3 无重复字符的最长子串   24.2% 中等 18 四数之和   ...

  9. LeetCode刷题的一点个人建议和心得

    目录 1.    为什么我们要刷LeetCode? 2.    LeetCode的现状和问题 3.    本文的初衷 4.    LeetCode刷题建议 4.1入门数据结构,打基础阶段 4.2 建立 ...

  10. leetcode 刷题进展

    最近没发什么博客了 凑个数 我的leetcode刷题进展 https://gitee.com/def/leetcode_practice 个人以为 刷题在透不在多  前200的吃透了 足以应付非算法岗 ...

随机推荐

  1. 【JAVA基础】String处理

    String处理 字符串查找子串及截取 // 保存的头像文件的文件名 String suffix = ""; String originalFilename = file.getO ...

  2. 我让 ChatGPT 化身为全知全能的文档小助理,啥姿势她都会......

    ChatGPT 虽然只是一个对话型人工智能,但已经震惊了全世界,有人甚至认为人工智能的奇点已经到来.未来一定会有很多人失业,从工业革命开始,每出现一次重大的技术变革,就必然会有一批人失业,我们要直面现 ...

  3. shell脚本(7)-shell运算

    文档目录: 一.算数运算符 二.关系运算符 三.布尔运算符 四.逻辑运算符 五.字符串运算符 六.文件测试运算符 算术运算符 下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20: ...

  4. java项目实践-tomcat实现用户登录-day17

    目录 1. 安装 2. 初识tomcat 2. 创建tomcat项目 3. 启动之前 3. java jsp 4. Request Response对象的其他属性 5. 用户登录小功能 1. 安装 t ...

  5. kibana上执行ES DSL语言查询数据并查看表结构与数据、删除索引、查看文件大小

    转载请注明出处: 1.kibana 上执行DSL 语言: 在kibana 中找到 Dev Tools,并双击打开,就可以进入执行DSL得执行页面了 执行DSL,示例如图: 2.在kibana上查看ES ...

  6. 02-VS调试以及Qt基本使用

    VS调试以及Qt基本使用 1.汇编语言 1.1 VS中C语言嵌套汇编代码(了解) #include <stdio.h> int main() { //定义整型变量a, b, c int a ...

  7. 【ArgParse】一个开源的入参解析库

    项目地址:argtable3 本地验证: 编译构建 新增验证 // examples/skull.c #include "argtable3.h" int main(int arg ...

  8. [转帖]ssh时不输入YES

    vim /etc/ssh/ssh_config 60行新添加 StrictHostKeyChecking no

  9. 【转帖】奇淫技巧 | route命令设置网络优先级

    奇淫技巧 | route命令设置网络优先级 https://blog.csdn.net/DynmicResource/article/details/120134745 1. 背景 在生活中的会经常遇 ...

  10. [转帖]Linux中的Page cache和Buffer cache详解

    1.内存情况 在讲解Linux内存管理时已经提到,当你在Linux下频繁存取文件后,即使系统上没有运行许多程序,也会占用大量的物理内存.这是因为当你读写文件的时候,Linux内核为了提高读写的性能和速 ...