109.有序链表转化搜索二叉树 python

题目

题目描述

给定一个单链表的头节点 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),我们可以采取以下步骤:

方法:找到中间节点作为根节点

由于给定链表是有序的,因此可以利用这一特性来构建一个高度平衡的二叉搜索树。基本思路是递归地选择链表的中间元素作为当前子树的根节点,然后对左半部分和右半部分分别进行相同的操作以构造左右子树。

实现步骤:

  1. 找中点:使用快慢指针法找到链表的中间节点。快指针每次移动两步,慢指针每次移动一步,当快指针到达链表末尾时,慢指针就位于中间位置。
  2. 递归构建
    • 如果链表为空,返回None
    • 找到链表的中间节点作为当前树或子树的根节点。
    • 对中间节点左侧的链表递归构建左子树。
    • 对中间节点右侧的链表递归构建右子树。
  3. 连接子树与根节点:将构建好的左右子树连接到根节点上。

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是链表的长度。

提交结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gxls2024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值