Leetcode109. 有序链表转换二叉搜索树
题目:
相似题目:Leetcode108. 将有序数组转换为二叉搜索树
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定的有序链表: [-10, -3, 0, 5, 9],
一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
题解:
- 快慢指针找到链表的中间节点;
- 此节点作为二叉搜索树的根节点;
- 中间节点左部构建成二叉搜索树的左子树,中间节点右部分构建成二叉搜索树的右子树。
java代码:
/**
*
* @param head
* @return
*/
public static TreeNode sortedListToBST(ListNode head) {
if (head == null) return null;
return binarySearch(head, null);
}
private static TreeNode binarySearch(ListNode head, ListNode tail) {
if (head == tail) return null;
ListNode fast = head;
ListNode slow = head;
while (fast != tail && fast.next != tail) {
slow = slow.next;
fast = fast.next.next;
}
TreeNode node = new TreeNode(slow.value);
node.left = binarySearch(head, slow);
node.right = binarySearch(slow.next, tail);
return node;
}