给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定的有序链表: [-10, -3, 0, 5, 9],
一个可能的答案是:[0, -3, 9, -10, null, 5]
当然可以参考leetcode108. 将有序数组转换为二叉搜索树把链表写入list中再处理,其实关键的地方在于找到中间点的位置,可以用快慢指针来搞定:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def sortedListToBST(self, head: ListNode) -> TreeNode:
if not head:
return None
return self.helper(head, None)
def helper(self, begin, end): # 辅助函数,[begin:end]
if begin == end:
return None
slow, fast = begin, begin
while fast != end and fast.next != end:
slow = slow.next
fast = fast.next.next
res = TreeNode(slow.val)
res.left = self.helper(begin, slow)
res.right = self.helper(slow.next, end)
return res