看问题,首先想到的解决办法如下:

(1)单独设计一个函数可以,计算出有序链表的中间节点的前驱节点。后续会看到原因,这个函数进入的有序链表长度长度至少有2个节点;

(2)回到原来需要设计的函数:

a. 如果没有节点返回null,如果是只有一个节点,将这个节点制造成树节点返回;由于这个原因,输入到寻找前驱节点的问题的有序链表至少2个节点;

b. 找到前驱节点,找到中间节点,完成赋值。

c. 在前驱节点和中间节点之间进行切段;为了实现分治递归的用途;

d. 递归寻找左节点,右节点;返回根节点;

其中:单独设计函数非常值得一提,因为:2/2 = 1, 3/2 = 1; 4/2 = 2, 5/2 = 2; ~~~  在进行整数除法的时候;

所以,寻找前驱函数的循环设计,需要讲所有情况规约成  偶,奇 一组的样子,而且,由于起点是2,所以每次都是偶在前面,奇在后面;

public class Solution {ListNode getLeftNodeFromList(ListNode head){//默认就至少有2个链表节点ListNode next = head.next;ListNode index = head.next;ListNode pre = head;while(next != null){next = next.next;if(next == null) break;next = next.next;if(next == null) break;pre = pre.next;index = pre.next;}return pre;}public TreeNode sortedListToBST(ListNode head) {if(head == null) return null;if(head.next == null) return new TreeNode(head.val);ListNode left = getLeftNodeFromList(head);ListNode mid = left.next;left.next = null;TreeNode root = new TreeNode(mid.val);root.left = sortedListToBST(head);root.right = sortedListToBST(mid.next);return root;}
}

当然,这个办法不是最好的,稍后会讨论最优解,这个解由于利用递归,时间复杂度为:O(N*lgN)

首先回忆一下二分查找两个经典的写法:

迭代写法:

public int rank(Key key)
{int lo = 0, hi = N-1;while(lo <= hi){int mid = lo + (hi - lo)/2;int cmp = key.compareTo(Key[mid]);if        (cmp < 0) hi = mid - 1;else if (cmp > 0) lo = mid +1;else return mid;}return lo;
}

递归实现:

public int rank(Key key, int lo, int hi)
{if(hi < lo) return lo;int mid = lo + (hi - lo)/2;int cmp = key.compareTo(keys[mid]);if (cmp < 0) return rank(key, lo, mid-1);else if (cmp > 0) return rank(key, mid+1, hi);else return mid;
}

找到时lo,hi,mid全都指向那个需要的元素;没找到的时候,都是lo>hi;而且lo正确指向的该元素应该占据的位置!

利用二分思想的代码如下:

public class Solution {  static ListNode currentHead = null;  TreeNode buildTree(int start, int end) {  if(start>end) {  return null;  }  int mid = start + (end - start)/2;  TreeNode left = buildTree(start, mid-1);  TreeNode root = new TreeNode(currentHead.val);  root.left = left;  currentHead = currentHead.next;  root.right = buildTree(mid + 1, end);  return root;  }  public TreeNode sortedListToBST(ListNode head) {  if(head==null) {  return null;  }  currentHead = head;  int len = 0;  while(head!=null) {  len++;  head = head.next;  }  return buildTree(0, len-1);  }
}  

规律:0-7的切分:递归过程自然可以看树生成的过程!!!仔细一看会发现,其实就是中序遍历!!!!!!

0    7

0    2       mid=3        4    7

0   0     mid=1   2   2        4   4   mid=5    6   7

0  -1  mid=0  1  0      2  1  mid=2  3  2      4  3  mid=4  5  4    6  5  mid=6  7  7

7  6  mid=7  8  7

转载于:https://www.cnblogs.com/ProWhalen/p/5386195.html

109. Convert Sorted List to Binary Search Tree 将一个有序链表转化成BST相关推荐

  1. 【链表递归构造二叉树】LeetCode 109. Convert Sorted List to Binary Search Tree

    LeetCode 109. Convert Sorted List to Binary Search Tree Solution1:我的答案 偷鸡摸狗的做法 /*** Definition for s ...

  2. LeetCode: 109. Convert Sorted List to Binary Search Tree

    题目 Given a singly linked list where elements are sorted in ascending order, convert it to a height b ...

  3. 【leetcode】109. Convert Sorted List to Binary Search Tree

    题目如下: Given a singly linked list where elements are sorted in ascending order, convert it to a heigh ...

  4. 109. Convert Sorted List to Binary Search Tree

    题目 原始地址:https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/#/description /*** D ...

  5. LeetCode 109. Convert Sorted List to Binary Search Tree

    Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...

  6. LeetCode Convert Sorted List to Binary Search Tree(有序单链表转为平衡二叉树)

    题意:给出一个有序的单链表,将其转换成平衡二叉树 思路:因为是有序的,所以可以将其分成两部分,前部分作为左子树,后部分作为右子树 代码如下: class ListNode {int val;ListN ...

  7. Convert Sorted Array to Binary Search Tree - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Convert Sorted Array to Binary Search Tree - LeetCode 注意点 不要访问空结点 题目要求的是平衡二叉搜 ...

  8. leetcode -day19 Convert Sorted List to Binary Search Tree

    1.  Convert Sorted List to Binary Search Tree Given a singly linked list where elements are sorted ...

  9. LeetCode: Convert Sorted Array to Binary Search Tree 解题报告

    Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...

  10. 【数组递归构造二叉树】LeetCode 108. Convert Sorted Array to Binary Search Tree

    LeetCode 108. Convert Sorted Array to Binary Search Tree Solution1:我的答案 构造二叉树利用递归 /*** Definition fo ...

最新文章

  1. python统计个数的函数_Python
  2. web页面实现地图展示,可缩放,标点并点击---使用高德地图
  3. windows下sshfs挂载远程文件夹-server could not connect故障解决
  4. selenium webdirver之ruby-开发ide安装
  5. 为什么借助开源学习是最有效的?
  6. 去授权美化版LM在线表白网页制作PHP源码
  7. 【英语学习】【医学】有机化学 - 烷的命名
  8. vs 2012打包程序
  9. 在Reporting Services (RDL)中自动生成大量列
  10. 一步一步写算法(之线性结构的处理)
  11. 生成全1矩阵_2020美赛A题(1)-图像处理
  12. DIV块中 元素垂直居中
  13. Magento发布前检查清单
  14. 开源考试系统 -微信小程序开发
  15. 关于列表的一些操作函数
  16. 浅谈对二分查找最大次数的理解
  17. 王可欣作业一 统计软件简介与数据操作
  18. -D指定db登陆失败ERROR 1044 (42000): Access denied for user ‘lzldb‘@‘%‘ to database ‘lzldb‘
  19. [题单]多校补题 2017-2012
  20. UART SPI I2C 接口介绍 转载

热门文章

  1. jQuery编写插件()
  2. Android图像办理组件
  3. C++/C学习笔记(二)
  4. 用.NET的File控件上传文件的解决方案
  5. 第二节--PHP5 的对象模型 -- Classes and Objects in PHP5 [2](转)
  6. MD5加密、Base64加密解密
  7. Redis:四、jedis连接redis服务器
  8. Mysql 设置问题,当使用一些开源的软件动态安装MYSQL数据库后,发现里面的中文全是乱码。...
  9. Beta冲刺提交-星期五
  10. Request.Querystring中文乱码问题解决