当前位置: 首页 > 知识库问答 >
问题:

将排序链表转换为平衡BST

芮安顺
2023-03-14

我正在处理以下面试问题:

给定一个元素按升序排序的单链表,将其转换为高度平衡的BST。

public TreeNode toBST(ListNode head) {
    if(head==null) return null;
    return helper(head,null);
}
public TreeNode helper(ListNode head, ListNode tail){
    ListNode slow = head;
    ListNode fast = head;
    if(head==tail) return null;

    while(fast!=tail && fast.next!=tail){
        fast = fast.next.next;
        slow = slow.next;
    }
    TreeNode thead = new TreeNode(slow.val);
    thead.left = helper(head,slow);
    thead.right = helper(slow.next,tail);
    return thead;
}

共有1个答案

姬弘文
2023-03-14

平衡树可以从排序的列表中构造,方法是将列表细分为两个等长的列表,中间的一个元素用作根。例如:

1.                       [1, 2, 3, 4, 5, 6, 7]


2.                               4
                           /           \
                       [1, 2, 3]     [5, 6, 7]


3.                               4
                            /          \
                           2           6
                          / \         / \
                          1  3        5  7

即使两个子列表相差一个元素,它们在高度上最多也能相差1,从而使树平衡。通过选择列表的中间元素,可以保证生成的树是一个BST,因为所有较小的元素都是左子树的一部分,所有较大的元素都是右子树的一部分。

您的代码使用两个迭代器工作,其中一个(快速)迭代节点的速度是另一个()的两倍。因此,当fast到达列表的尾部或尾部之前的节点时,slow必须位于列表中间的节点,从而将列表分成两个子列表,长度相同(最多差一个元素),然后可以如上图所示对其进行递归处理。

T(n) = n / 2 + 2 * T(n / 2)
T(1) = 1

如果忽略输出,则空间复杂度仅依赖于递归深度,递归深度为O(lgn),从而使得空间复杂度O(lgn)

 类似资料:
  • 这不是一个重复的问题。 当我们将排序数组转换为BST时,我们确实从元素的左部分和右部分得到左和右。而当我们试图转换双链表时,为什么我们从得到正确的结果。 基本上,我想明白为什么会有差别,以及如何向某人解释。

  • 本文向大家介绍在C ++中将单链表转换为XOR链表,包括了在C ++中将单链表转换为XOR链表的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将讨论将单链表转换为XOR链表的程序。 为此,我们将提供一个单链表。我们的任务是获取该列表的元素,并将其转换为XOR链接列表。 示例 输出结果

  • 如何将按排序顺序转换为而不更改()?我们希望保留和。 将2,3,1添加到将其排序为1,2,3。从创建一个将具有2,3,1的顺序。中的和方法也将具有2,3,1的顺序。我猜这与的实现有关。

  • 本文向大家介绍在C ++中将单链表转换为循环链表,包括了在C ++中将单链表转换为循环链表的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将讨论将单链接列表转换为循环链接列表的程序。 为此,我们将提供一个单链表。我们的任务是获取该列表的元素,并将其转换为循环链接列表。 示例 输出结果

  • 是否可以仅使用CSS将水平表转换为垂直表? 以下是我的资料: 我想要的是: 第一报头单元第一数据单元 第2首标单元第2数据单元 第三报头单元第三数据单元 第四报头单元第四数据单元 我的代码: null null

  • 我如何转换使用以下代码,我的二叉树到一个简单的链表。这也许可以用递归来完成。 因此,如果根为NULL,也就是,如果函数没有收到有效的指针,则返回错误消息。 如果根是叶,这是,如果左子节点和右子节点都为NULL,您必须将其添加到叶节点列表中。