返回

leetcode_109 有序链表转换二叉搜索树,获取更加清晰的思路

闲谈

  1. 问题概述

leetcode_109 有序链表转换二叉搜索树,问题如下:

给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

输入:

    4->2->1->3

输出:

       2
      / \
     1   3

2. 解决方案

2.1 核心思路

将有序链表转换为高度平衡的二叉搜索树的核心思路是:

  1. 找到链表的中间节点。
  2. 将中间节点作为二叉搜索树的根节点。
  3. 将中间节点左边的链表转换为左子树。
  4. 将中间节点右边的链表转换为右子树。
  5. 重复步骤 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 另一种解法

另一种解法是使用递归的方式将链表转换为二叉搜索树。具体步骤如下:

  1. 如果链表为空,则返回空节点。
  2. 否则,找到链表的中间节点。
  3. 将中间节点作为二叉搜索树的根节点。
  4. 将中间节点左边的链表转换为左子树。
  5. 将中间节点右边的链表转换为右子树。
  6. 返回根节点。

另一种解法代码如下:

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. 总结

本文介绍了将有序链表转换为高度平衡的二叉搜索树的两种解法。第一种解法是使用迭代的方式,第二种解法是使用递归的方式。希望通过本文,您能够对该问题有更深刻的理解。