将二叉树展平成链表2025年3月17日 | 阅读 8 分钟 引言二叉树中的每个节点最多有两个子节点,即左子节点和右子节点,这使其成为一种分层数据结构。为了将二叉树转换为链表,必须以特定顺序重新排列树节点以形成线性结构。此过程称为“扁平化”。目标是重新排列二叉树的节点,使其树结构保持不变,同时创建链表。重要的是要以特定顺序创建链表,以方便简单的遍历。 ![]() 方法 1:递归递归方法采用深度优先遍历方式,通过迭代遍历树结构将二叉树扁平化为链表。该函数在每个阶段寻找一个基本情况,确保在检测到空节点时停止。该方法在扁平化左子树之前保留对右子树的引用,这对于后续的重新连接至关重要。然后通过对左子树的递归调用重复该过程。该函数扁平化左子树,然后通过调整指针将其移动到当前节点的右侧。它递归地扁平化原始右子树,并继续到这个新的扁平化右子树的末尾。由于它是递归的,整个二叉树都被检查,并且节点以特定序列重新排列以创建链表。递归之所以优雅,是因为它可以将复杂问题分解为更小、更易于管理的小问题,从而产生更简洁、更具表达力的代码。 代码 输出 ![]() 代码解释 二叉树节点定义
扁平化函数
基本情况验证
保存右子树
左侧扁平化子树
将扁平化左子树转移到右侧
向右前进,直到扁平化子树的末尾
原始右子树扁平化
将末尾与扁平化右子树连接
打印链表函数
方法 2:堆栈此方法使用显式堆栈来跟踪节点,因为它遍历图。根节点被压入算法已初始化的空堆栈中。在 while 循环的每次迭代中,从堆栈中移除一个节点,该循环一直运行直到堆栈为空。如果存在堆栈,则首先将右子节点压入堆栈,然后压入左子节点。由于这种安排,左子节点的处理先进行。该技术同时修改指针以将当前节点连接到适当的子节点。二叉树通过使用堆栈显式管理遍历顺序并相应地修改指针进行深度优先扁平化。当不希望进行递归时,此方法特别有用,因为显式堆栈提供了一种有组织的方法来顺序处理遍历和扁平化过程。 代码 输出 ![]() 代码解释 二叉树节点定义
堆栈节点定义
堆栈定义
堆栈初始化
空堆栈检查
压入机制
弹出函数
扁平化机制
方法 3:无堆栈迭代此技术使用线程二叉树架构隐式模拟堆栈的功能。它利用了 Morris 遍历树遍历方法,该方法将每个节点的最右侧子节点与其在中序遍历序列中的后继节点连接起来,从而改变树拓扑。Morris 遍历经过修改以实现扁平化目的,以便它可以同时遍历和扁平化树,从而消除了对堆栈或其他额外数据结构的需求。该算法通过在节点之间创建线程连接并沿途修改指针,快速准确地遍历树。此技术的特点是其恒定的空间复杂度,这使其成为递归和基于堆栈的方法的省内存且有效的替代方案。 代码 输出 ![]() 代码解释 二叉树节点定义
扁平化函数
主函数
内存解除分配 主函数中的 while 循环释放为扁平化链表和二叉树节点分配的内存。链表中的每个节点在遍历时都会被释放。 |
我们请求您订阅我们的新闻通讯以获取最新更新。