题目
题目描述
给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为
平衡二叉搜索树。
示例 1:
输入: head = [-10,-3,0,5,9]
输出: [0,-3,9,-10,null,5]
解释: 一个可能的答案是[0,-3,9,-10,null,5],它表示所示的高度平衡的二叉搜索树。
示例 2:
输入: head = []
输出: []
提示:
head 中的节点数在[0, 2 *
1
0
4
10^4
104] 范围内
-
1
0
5
10^5
105 <= Node.val <=
1
0
5
10^5
105
题解
要将一个按升序排序的单链表转换为平衡二叉搜索树(BST),我们可以采取以下步骤:
方法:找到中间节点作为根节点
由于给定链表是有序的,因此可以利用这一特性来构建一个高度平衡的二叉搜索树。基本思路是递归地选择链表的中间元素作为当前子树的根节点,然后对左半部分和右半部分分别进行相同的操作以构造左右子树。
实现步骤:
- 找中点:使用快慢指针法找到链表的中间节点。快指针每次移动两步,慢指针每次移动一步,当快指针到达链表末尾时,慢指针就位于中间位置。
- 递归构建:
- 如果链表为空,返回
None
。 - 找到链表的中间节点作为当前树或子树的根节点。
- 对中间节点左侧的链表递归构建左子树。
- 对中间节点右侧的链表递归构建右子树。
- 如果链表为空,返回
- 连接子树与根节点:将构建好的左右子树连接到根节点上。
python实现
下面是基于上述逻辑的一个Python实现示例:
def sortedListToBST(head: ListNode) -> TreeNode:
if not head:
return None
if not head.next:
return TreeNode(head.val)
# 使用快慢指针找到链表中点
slow, fast = head, head.next.next
while fast and fast.next:
fast = fast.next.next
slow = slow.next
# 中间节点作为根节点
root = TreeNode(slow.next.val)
# 右子链表
right_head = slow.next.next
# 断开左子链表与根节点的连接
slow.next = None
# 递归构建左右子树
root.left = sortedListToBST(head)
root.right = sortedListToBST(right_head)
return root
这个方法通过递归的方式有效地构建了一个平衡的二叉搜索树,并且保证了树的高度尽可能小,使得查找、插入等操作的时间复杂度保持在O(log n)级别。对于输入链表中的每个节点,该算法只访问一次,所以时间复杂度为O(n),其中n是链表的长度。