将二叉树展平成链表

2025年3月17日 | 阅读 8 分钟

在本文中,我们将把一个二叉树转换为一个链表,并为此;我们将使用各种函数。在我们完成展平之后,每个节点的左侧应指向 NULL 值,而每个节点的右侧应包含下一个节点,但要遵循前序模式。

当我们谈论二叉树时,我们知道二叉树中的每个节点可以有两个子节点,即左子节点和右子节点。当我们展平二叉树时,我们必须重新排列树中的所有节点,以便左子节点放在节点之后,右子节点放在左子节点之后,我们必须重复这个整个过程,直到整个树被展平为止。

一些关键优势是:-

  1. 它们有助于树的高效序列化和反序列化。
  2. 它们在内存存储中也起着重要作用。
  3. 它们使各种操作的执行非常高效和有用。
  4. 展平二叉树还可以提高内存和缓存局部性。

实施

输出

Flatten Binary Tree to Linked List

代码的分步解释

  1. 它通常从声明程序所需的头文件以及输入输出操作的执行开始。
  2. 在代码的下一步,我们开始定义一个名为 'Node' 的结构,它代表二叉树中的一个节点,具有以下成员;数据以及指向左节点和右节点的指针。
  3. 键定义了一个辅助函数,帮助我们为数据分配内存和空间。
  4. 代码定义了一个名为 'flatten' 的函数,它接受一个节点指针并将 BST 转换为链表。
  5. 它以基本情况开始,并检查它是否包含 NULL 值;如果包含,则表示树为空。
  6. 如果 root->left 指针存在,则展平值已知存在于左子树中;如果 root->right 指针存在,则值已知存在于右子树中。
  7. 在递归调用之后,root->right 中的值立即传输到 tmpRight。
  8. 然后将 root->right 更改为 root->left,这也意味着它将右子树更改为左子树。
  9. root->left 设置为 NULL,因为我们将二叉树转换为链表。
  10. 现在,该函数客观地遍历整个树,找到一个地方将树的值存储在链表中。
  11. 在完成右子树后,该函数会在右子树上展平。
  12. 然后代码定义了一个名为 in-order 的函数,该函数执行树的中序遍历。
  13. 我们再次检查基本条件,即它是否为 NULL,如果是 NULL,则该函数会重复调用左子树上的 inorder 函数,并且它会打印当前节点的键。
  14. 最后,我们进入程序的主函数,它作为程序的入口点。
  15. 调用 flatten 函数,并将树的根作为参数传递,然后将结果传递给 print 函数以显示结果。

示例 2)

输出

Flatten Binary Tree to Linked List

代码的分步解释

  1. 代码开始定义两个重要的类:'Node' 和 'Binary tree'。二叉树包含程序的主要逻辑。
  2. 在代码的下一步,我们开始定义一个名为 'Node' 的结构,它代表二叉树中的一个节点,具有以下成员;数据以及指向左节点和右节点的指针。
  3. 键定义了一个辅助函数,帮助我们为数据分配内存和空间。
  4. 代码定义了 'flatten' 函数,它接受一个节点指针并将 BST 转换为链表。
  5. 它以基本情况开始,并检查它是否包含 NULL 值;如果包含,则表示树为空。
  6. 如果 root->left 指针存在,则展平值已知存在于左子树中;如果 root->right 指针存在,则值已知存在于右子树中。
  7. 在递归调用之后,root->right 中的值立即传输到 tmpRight。
  8. 然后将 root->right 更改为 root->left,这也意味着它将右子树更改为左子树。
  9. root->left 设置为 NULL,因为我们将二叉树转换为链表。
  10. 现在,该函数客观地遍历整个树,找到一个地方将树的值存储在链表中。
  11. 在完成右子树后,该函数会在右子树上展平。
  12. 然后代码定义了一个名为 in-order 的函数,该函数执行树的中序遍历。
  13. 我们再次检查基本条件,即它是否为 NULL,如果是 NULL,则该函数会重复调用左子树上的 inorder 函数,并且它会打印当前节点的键。
  14. 最后,我们进入程序的主函数,它作为程序的入口点。
  15. 调用 flatten 函数,并将树的根作为参数传递,然后将结果传递给 print 函数以显示结果。

示例 3)

输出

Flatten Binary Tree to Linked List

代码的分步解释

  1. 我们开始定义一个名为 'Node' 的结构,它代表二叉树中的一个节点,具有以下成员;数据以及指向左节点和右节点的指针。
  2. 键定义了一个辅助函数,帮助我们为数据分配内存和空间。
  3. 代码定义了 'flatten' 函数,它接受一个节点指针并将 BST 转换为链表。
  4. 它以基本情况开始,并检查它是否包含 NULL 值;如果包含,则表示树为空。
  5. 如果 root->left 指针存在,则展平值已知存在于左子树中;如果 root->right 指针存在,则值已知存在于右子树中。
  6. 在递归调用之后,root->right 中的值立即传输到 tmpRight。
  7. 然后将 root->right 更改为 root->left,这也意味着它将右子树更改为左子树。
  8. root->left 设置为 NULL,因为我们将二叉树转换为链表。
  9. 现在,该函数客观地遍历整个树,找到一个地方将树的值存储在链表中。
  10. 在完成右子树后,该函数会在右子树上展平。
  11. 然后代码定义了一个名为 in-order 的函数,该函数执行树的中序遍历。
  12. 我们再次检查基本条件,即它是否为 NULL,如果是 NULL,则该函数会重复调用左子树上的 inorder 函数,并且它会打印当前节点的键。
  13. 最后,我们进入程序的主函数,它作为程序的入口点。
  14. 调用 flatten 函数,并将树的根作为参数传递,然后将结果传递给 print 函数以显示结果。