Convert Sorted List to Binary Search Tree
- tag: BST, recursion
- medium
- similar: XXX to BST
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
思路
- 一看就想到了sorted array to Binary Search Tree, 是pre-order recursion, 然后root就是mid.
- 但是这里是list, 这样做的话, 每次都要loop一遍, 找middle node. 就变成了O(n^2)了.
- 其实使用in-order来做.
解法1: (我最开始的想法)
- 直接套用sorted array to Binary Search Tree来做, O(N^2).
- 代码如下:
解法2:
- 可以使用in-order来做. 因为in-order和list的正常遍历的顺序是一样的->只要next即可.
- 看来以前对in-order recursion还没有完全掌握.
- 参考的: leetcode discussion解法
- 代码如下:
private ListNode node;
public TreeNode sortedListToBST(ListNode head) {
if (head == null) return null;
int size = 0;
ListNode runner = head;
node = head;
while (runner != null) {
runner = runner.next;
size++;
}
return helper(0, size-1);
}
/**
* https://leetcode.com/discuss/23676/share-my-o-1-space-and-o-n-time-java-code
* @param start
* @param end
* @return
*/
private TreeNode helper(int start, int end) {
if (start > end) return null;
int mid = start + (end-start)/2;
TreeNode left = helper(start, mid-1);
TreeNode root = new TreeNode(node.val);
root.left = left;
node = node.next; // 关键点!!! 正是利用了in-order~list的遍历, 使得O(logN)!!!
TreeNode right = helper(mid+1, end);
root.right = right;
return root;
}
反思
- 要深入理解各种recursion. 以及各种数据结构之间的关系. 例如这里就是list=>tree的in-order traversal. 还有graph的pre/post/reverse...
- 根据数据结构的不同, 同类型题目的解法也会变化.
- list的recursion有时候会根据长度来找中间点, 所以recursion的参数是
start, end