原地将排序的双向链表转换为平衡二叉搜索树

2024年8月28日 | 阅读 4 分钟

在本教程中,我们将学习如何就地将已排序的双向链表 (DLL) 转换为平衡二叉搜索树 (BST)。

方法一(简单)

以下是一个简单的算法,我们首先找到链表的中间节点,并将其作为要构建的树的根。

1) 将链表的中间节点作为根。

2) 对左右两半部分递归执行相同操作。

  1. 获取左半部分的中间节点,并将其作为根的左子节点。
    步骤 1:已创建
  2. 获取右半部分的中间节点,并将其作为根的右子节点。
    步骤 1 导致创建了一个根。

时间复杂度为 O(nLogn),其中 n 表示链表中的节点数。

方法二(巧妙)

方法一从根到叶构建树。我们在此方法中从叶到根构建。其概念是按照它们在双向链表中出现的精确顺序将节点添加到 BST 中,以确保树确实可以在 O(n) 时间内构建。我们首先计算给定链表中的节点数。假设计数为 n。计数节点后,我们取左侧 n/2 个节点并递归构建左子树。构建完左子树后,我们将中间节点分配给根并连接左子树到根。最后,我们递归构建右子树并将其连接到根。

在构建 BST 的同时,我们不断将链表头指针移到下一个,以便在每次递归调用中获得正确的指针。

方法二的执行如下所示。下面展示了生成平衡 BST 的主要代码。

C 语言程序

C++ 程序

输出

Given Linked List
8 9 10 11 12 13 14 
 PreOrder Traversal of constructed BST 
 11 9 8 10 13 12 14

时间复杂度将是 O(n)。