109 Convert Sorted List to Binary Search Tree
2015-12-14 20:33
323 查看
题目链接:https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/
题目:
解题思路:
这题和 108 Convert Sorted Array to Binary Search Tree 十分相似。但是,由于递增序列是存储在链表中,不能在常数项时间里找到中间值作为根结点,所以不能采取相同的解决办法。
具体的思路,参考了大神的做法。
- 由于递增序列正好是二叉搜索树的中序遍历序列,因此可以将构建二叉树的过程抽象为二叉树的中序遍历。
- 从左子树开始创建结点,然后是根,最后是右子树。
- 这种方法解释起来简单但抽象,它的技巧在于,中序遍历前,先遍历一遍链表,获得链表结点的个数。
- 通过 l(左)和 r(右)的范围限定,逐渐将结点细化为左右子树和单个结点。
附上大神的解释:/article/1378249.html
这里的问题是对于一个链表我们是不能常量时间访问它的中间元素的。
这时候就要利用到树的中序遍历了,按照递归中序遍历的顺序对链表结点一个个进行访问,而我们要构造的二分查找树正是按照链表的顺序来的。
思路就是:
1. 先对左子树进行递归
2. 然后将当前结点作为根,迭代到下一个链表结点
整体过程就是一次中序遍历,时间复杂度是O(n),空间复杂度是栈空间O(logn)。
方法有些抽象,用例子模拟一遍就会清楚很多。
代码实现:
题目:
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
解题思路:
这题和 108 Convert Sorted Array to Binary Search Tree 十分相似。但是,由于递增序列是存储在链表中,不能在常数项时间里找到中间值作为根结点,所以不能采取相同的解决办法。
具体的思路,参考了大神的做法。
- 由于递增序列正好是二叉搜索树的中序遍历序列,因此可以将构建二叉树的过程抽象为二叉树的中序遍历。
- 从左子树开始创建结点,然后是根,最后是右子树。
- 这种方法解释起来简单但抽象,它的技巧在于,中序遍历前,先遍历一遍链表,获得链表结点的个数。
- 通过 l(左)和 r(右)的范围限定,逐渐将结点细化为左右子树和单个结点。
附上大神的解释:/article/1378249.html
这里的问题是对于一个链表我们是不能常量时间访问它的中间元素的。
这时候就要利用到树的中序遍历了,按照递归中序遍历的顺序对链表结点一个个进行访问,而我们要构造的二分查找树正是按照链表的顺序来的。
思路就是:
1. 先对左子树进行递归
2. 然后将当前结点作为根,迭代到下一个链表结点
整体过程就是一次中序遍历,时间复杂度是O(n),空间复杂度是栈空间O(logn)。
方法有些抽象,用例子模拟一遍就会清楚很多。
代码实现:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public TreeNode sortedListToBST(ListNode head) { if(head == null) return null; ListNode tmp = head; int count = 0; while(tmp != null) { tmp = tmp.next; count ++; } ArrayList<ListNode> list = new ArrayList(); list.add(head); return helper(list, 0, count - 1); } TreeNode helper(ArrayList<ListNode> list, int l, int r) { if(l > r) return null; int mid = (l + r) / 2; TreeNode left = helper(list, l, mid - 1); TreeNode root = new TreeNode(list.get(0).val); root.left = left; list.set(0, list.get(0).next); root.right = helper(list, mid + 1, r); return root; } }
32 / 32 test cases passed. Status: Accepted Runtime: 2 ms
相关文章推荐
- ajax实现提交数据并且不跳转
- OpenStack-RPC-server的构建(一)
- android中JSON的解析
- SecureCRT中文显示乱码的解决方法
- hdoj 5596 GTW likes gt 【思维】
- 服务器共享文件夹设置软件、局域网共享文件夹加密工具、文件共享服务器软件的选择
- hdoj 5595 GTW likes math 【水题】
- 权限框架的搭建
- uva 10635-Prince and Princess 【LIS 求解 LCS】
- VS2013 无法打开包括文件:“cv.h”
- LA 3882 - And Then There Was One 【约瑟夫环变形】
- 自己动手写cocos2dx游戏引擎(一)——引擎入口
- RESTful
- 行为型模式(二)
- 感恩过往,珍爱当下,感激等待
- java reflect反思总结
- iOS_开发中遇到的那些问题_6
- GPS卫星信号(二):导航电文
- AutoCAD二次开发三种添加插件按钮的方法之二
- Platinum SDK 使用 NDK 编译