题目地址:
https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/
将有序链表转换成一个二叉搜索树。可以用分治法。先找到链表中点之前的那个node,然后以中点的值为root,对中点右半边建树,断开前半边和中点,接着对左半边建树,最后把两个树的树根分别作为root的左右孩子加到root上去,最后把root返回。递归的base case是链表长为
0
0
0或
1
1
1或
2
2
2。
public class Solution {
public TreeNode sortedListToBST(ListNode head) {
TreeNode root = null;
if (head == null) {
return null;
}
if (head.next == null) {
root = new TreeNode(head.val);
return root;
}
if (head.next.next == null) {
root = new TreeNode(head.next.val);
root.left = new TreeNode(head.val);
return root;
}
ListNode beforeMid = findBeforeMid(head);
root = new TreeNode(beforeMid.next.val);
root.right = sortedListToBST(beforeMid.next.next);
beforeMid.next = null;
root.left = sortedListToBST(head);
return root;
}
private ListNode findBeforeMid(ListNode head) {
if (head == null) {
return head;
}
ListNode slow = head, fast = head.next;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
时间复杂度 O ( n log n ) O(n\log n) O(nlogn),空间 O ( h ) O(h) O(h)。