您的位置:首页 > 其它

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/

题目:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: