leetcode 109. 有序链表转换二叉搜索树
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定的有序链表: [-10, -3, 0, 5, 9],
一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
思路
由于链表是有序的,所以可以先找到链表的中点作为根,然后递归转换链表的左半部分和右半部分为二叉搜索树
# 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
elif not head.next:
return TreeNode(head.val)
pre = head
p = pre.next
q = p.next
# 快慢指针找中点
while q and q.next:
pre = pre.next
p = p.next
q = q.next.next
pre.next = None # 前半段链表,要注意截断
root = TreeNode(p.val) # 中点作为根节点
root.left = self.sortedListToBST(head) # 递归转换左半部分链表作为根节点的左子树
root.right = self.sortedListToBST(p.next) # 递归转换右半部分链表作为根节点的右子树
return root