C++ 可折叠二叉树

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

在本文中,我们将介绍 C++ 中的可折叠二叉树。在 C++ 中,可折叠二叉树是一种树数据结构,其中每个节点的左右子树互为镜像。如果沿着树的中心折叠,**左子树**和**右子树**应具有相同的结构。在实现可折叠二叉树时,会迭代检查这种镜像对称性。如果节点的每个左右子节点重叠,则该树是可折叠的。C++ 中的递归算法可以实现此特性,这对于某些树操作至关重要。

我们可以使用不同的方法

  1. 通过切换到左子树的镜像来实现可折叠二叉树
  2. 通过确定左右子树是否为镜像图像来找到可折叠二叉树
  3. 使用广度优先搜索方法

1. 通过切换到左子树的镜像来实现可折叠二叉树

目标是将**左子树**转换为其镜像,然后将其与**右子树**进行比较。您可以按照以下步骤解决此问题

  • 如果树为空,则返回 true。
  • 接下来,将**左子树**转换为其镜像图像。
  • 之后,检查并保存结果,如果左右子树的结构相同。
  • **`istheStructSame(root->left, root->right) = res. istheStructSame()`** 递归比较两个子树的结构,如果结构相同则返回 true。
  • 撤消步骤 (2) 中所做的更改以恢复原始树。
  • 最后,返回步骤 3 中存储的结果 **`res`**。

文件名:Is_foldable.cpp

输出

The given tree is foldable.

2. 通过确定左右子树是否为镜像图像来找到可折叠二叉树

目标是确定左右子树是否为镜像。您可以按照以下步骤解决此问题

  • 如果树为空,则返回 true。
  • 否则,检查左右子树的结构是否相似。使用实用函数 **`IsFoldable(root->left, root->right)`**。
  • 检查 **`m1`** 和 **`m2`** 是否互为镜像。
  • 如果两棵树都不为空,则返回 true。
  • 如果一棵为空而另一棵不为空,则返回 **`false`**。
  • 如果满足以下要求,则返回 true。
  • **`n1->left`** 是 **`n2->right`** 的镜像图像。
  • **`n1->right`** 是 **`n2->left`** 的镜像图像。

文件名:Is_foldable_mirror.cpp

输出

The given tree is foldable.

3. 使用广度优先搜索方法

想法是使用 **`Queue`** 和 BFS 技术遍历树。您可以按照以下步骤解决此问题

  • **右子树**的右子节点是左子树的左子节点。它们中的每一个都应该是有效的。
  • 右子树的左子节点等于左子树的右子节点。它们都应该为 null 或不为 null。

文件名:IsFoldableTree.cpp

输出

The given tree is foldable.