109. Convert Sorted List to Binary Search Tree 将一个有序链表转化成BST
看问题,首先想到的解决办法如下:
(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相关推荐
- 【链表递归构造二叉树】LeetCode 109. Convert Sorted List to Binary Search Tree
LeetCode 109. Convert Sorted List to Binary Search Tree Solution1:我的答案 偷鸡摸狗的做法 /*** Definition for s ...
- 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 ...
- 【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 ...
- 109. Convert Sorted List to Binary Search Tree
题目 原始地址:https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/#/description /*** D ...
- 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 ...
- LeetCode Convert Sorted List to Binary Search Tree(有序单链表转为平衡二叉树)
题意:给出一个有序的单链表,将其转换成平衡二叉树 思路:因为是有序的,所以可以将其分成两部分,前部分作为左子树,后部分作为右子树 代码如下: class ListNode {int val;ListN ...
- Convert Sorted Array to Binary Search Tree - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Convert Sorted Array to Binary Search Tree - LeetCode 注意点 不要访问空结点 题目要求的是平衡二叉搜 ...
- 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 ...
- 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 ...
- 【数组递归构造二叉树】LeetCode 108. Convert Sorted Array to Binary Search Tree
LeetCode 108. Convert Sorted Array to Binary Search Tree Solution1:我的答案 构造二叉树利用递归 /*** Definition fo ...
最新文章
- python统计个数的函数_Python
- web页面实现地图展示,可缩放,标点并点击---使用高德地图
- windows下sshfs挂载远程文件夹-server could not connect故障解决
- selenium webdirver之ruby-开发ide安装
- 为什么借助开源学习是最有效的?
- 去授权美化版LM在线表白网页制作PHP源码
- 【英语学习】【医学】有机化学 - 烷的命名
- vs 2012打包程序
- 在Reporting Services (RDL)中自动生成大量列
- 一步一步写算法(之线性结构的处理)
- 生成全1矩阵_2020美赛A题(1)-图像处理
- DIV块中 元素垂直居中
- Magento发布前检查清单
- 开源考试系统 -微信小程序开发
- 关于列表的一些操作函数
- 浅谈对二分查找最大次数的理解
- 王可欣作业一 统计软件简介与数据操作
- -D指定db登陆失败ERROR 1044 (42000): Access denied for user ‘lzldb‘@‘%‘ to database ‘lzldb‘
- [题单]多校补题 2017-2012
- UART SPI I2C 接口介绍 转载
热门文章
- jQuery编写插件()
- Android图像办理组件
- C++/C学习笔记(二)
- 用.NET的File控件上传文件的解决方案
- 第二节--PHP5 的对象模型 -- Classes and Objects in PHP5 [2](转)
- MD5加密、Base64加密解密
- Redis:四、jedis连接redis服务器
- Mysql 设置问题,当使用一些开源的软件动态安装MYSQL数据库后,发现里面的中文全是乱码。...
- Beta冲刺提交-星期五
- Request.Querystring中文乱码问题解决