返回
leetcode_109 有序链表转换二叉搜索树,获取更加清晰的思路
闲谈
2024-01-03 12:34:58
- 问题概述
leetcode_109 有序链表转换二叉搜索树,问题如下:
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
输入:
4->2->1->3
输出:
2
/ \
1 3
2. 解决方案
2.1 核心思路
将有序链表转换为高度平衡的二叉搜索树的核心思路是:
- 找到链表的中间节点。
- 将中间节点作为二叉搜索树的根节点。
- 将中间节点左边的链表转换为左子树。
- 将中间节点右边的链表转换为右子树。
- 重复步骤 1-4,直到所有的节点都转换为二叉搜索树。
2.2 代码实现
核心代码如下:
def sortedListToBST(head):
"""
:type head: ListNode
:rtype: TreeNode
"""
if not head:
return None
# 找到链表的中间节点
slow = head
fast = head.next
while fast and fast.next:
slow = slow.next
fast = fast.next.next
# 将中间节点作为二叉搜索树的根节点
root = TreeNode(slow.val)
# 将中间节点左边的链表转换为左子树
if slow != head:
root.left = sortedListToBST(head)
# 将中间节点右边的链表转换为右子树
root.right = sortedListToBST(slow.next)
return root
2.3 另一种解法
另一种解法是使用递归的方式将链表转换为二叉搜索树。具体步骤如下:
- 如果链表为空,则返回空节点。
- 否则,找到链表的中间节点。
- 将中间节点作为二叉搜索树的根节点。
- 将中间节点左边的链表转换为左子树。
- 将中间节点右边的链表转换为右子树。
- 返回根节点。
另一种解法代码如下:
def sortedListToBST(head):
"""
:type head: ListNode
:rtype: TreeNode
"""
def helper(head, tail):
if head == tail:
return None
# 找到链表的中间节点
slow = head
fast = head.next
while fast != tail and fast.next != tail:
slow = slow.next
fast = fast.next.next
# 将中间节点作为二叉搜索树的根节点
root = TreeNode(slow.val)
# 将中间节点左边的链表转换为左子树
root.left = helper(head, slow)
# 将中间节点右边的链表转换为右子树
root.right = helper(slow.next, tail)
return root
return helper(head, None)
3. 总结
本文介绍了将有序链表转换为高度平衡的二叉搜索树的两种解法。第一种解法是使用迭代的方式,第二种解法是使用递归的方式。希望通过本文,您能够对该问题有更深刻的理解。