我正在处理以下面试问题:
给定一个元素按升序排序的单链表,将其转换为高度平衡的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. [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,您必须将其添加到叶节点列表中。