最小交换次数将二叉树转换为二叉搜索树

2025年2月6日 | 阅读6分钟

引言

为了将二叉树转换为二叉搜索树,您必须以中序遍历的方式遍历二叉树,并将值存储在一个数组中以备将来参考。然后进行排序,并进行第二次中序遍历以重新考虑二叉树节点的值。将二叉树转换为 BST 所需的最少交换次数是数组中值尚未排序的位置数量。

问题陈述

给定一个节点包含整数值的二叉树。此二叉树格式应转换为最少交换次数的二叉搜索树 (BST)。

交换定义为从二叉树中选择两个节点,交换它们的值,然后相应地更新树。我们的目标是计算将给定二叉树转换为有效二叉搜索树所需的最少交换次数。

二叉搜索树是一种二叉树,其中对于每个节点:

  • 节点值至少与其左子树的最大值一样大。
  • 节点值要么足够大于,要么足够小于其右侧子树中的所有值。

方法

  1. 对二叉树执行中序遍历操作并将值存储在数组中。
  2. 对数组进行排序。
  3. 再次对二叉树应用中序遍历技术,并使用排序后的数组更改节点数据。
  4. 计算数组中未按排序顺序显示的数组索引的数量。这实际上只是必要的快速排序的最少次数。

算法

代码实现

输出

Minimum Swap Required to Convert Binary Tree to Binary Search Tree

说明

  1. 类定义: TreeNode 类用于定义二叉树中的节点,其中节点可以保存整数值并具有左右子指针。BinaryTreeToBST 类包含将二叉树转换为 BST 的主要过程。
  2. 成员变量: 一个 ArrayList,用于在进行中序遍历时存储二叉树的值。
  3. 构造函数: BinaryTreeToBST 类没有专门定义的构造函数。
  4. 方法:minSwapsToBST
    • 签名: private int minSwapsToBST(TreeNode root)
    • 输入: 二叉树的起始点。
    • 输出: 将二叉树转换为 BST 所需的最少交换次数。
  5. 以中序遍历二叉树并用值填充值列表。此步骤使我们能够获取值的有序列表。
  6. 对值列表进行排序,使其按升序排列。排序后的列表表示二叉搜索树的值。
  7. 现在以中序缓慢遍历树。将每个节点的值与排序列表(值)中的相应值进行比较。如果值不在正确的顺序,则进行交换以使其处于正确的顺序。计算交换次数。
  8. 创建一个带有值 5 3 8 2 4 的示例二叉树。将根节点指针传递给函数 minSwapsToBST。打印最少交换次数。
  9. 输出: 代码显示将输入二叉树转换为有效二叉搜索树所需的最少交换次数。

替代方法:迭代构建 BST

中序遍历以构建排序数组: 对给定二叉树执行中序遍历,并将遍历过程中的值放入数组中。此表将按升序排列。

迭代构建 BST: 采用迭代中序遍历访问提供的二叉树的节点。用排序数组中的相应元素替换节点值。在遍历过程中,同时更改二叉树的节点,推动排序数组的值,将二叉树转换为 BST。

计算交换: 跟踪每次通过完成的交换次数。

算法

代码实现

输出

Minimum Swap Required to Convert Binary Tree to Binary Search Tree

说明

  1. BinaryTreeToBST 类配备了一个 convertToBST 方法,该方法将接受两层树的初始值,并随后返回此树转换为二叉搜索树的最终值。
  2. convertToBST 方法的关键逻辑是向其中添加一个新列表,此列表的每个元素都等于左右子树计数的总和。
  3. 此操作通过 inOrderTraversal 算法实现,它意味着遍历所有节点以将其值存储在值列表中。
  4. 通过 buildBST 技术,BST 是从边树生成的,这是已保存在列表中的属性之一。枢纽值被传递下去,并且结果是文化增长。
  5. 主要功能涉及从左右树示例进行转换,该示例演示了树如何通过显示的基本输出交易更改为 BST。

结论

当二叉树代码的节点地址更改为 BST 的地址时,通过 Java 方法进行,只有少数几种替代方法。该算法具有遍历和分类值的方法。同时,它在单个线程中执行更新以使节点值保持同步。BinaryTreeToBST 类执行符合二叉搜索树的约束,控制该过程。它使输出树除了是二叉搜索树之外。主要策略将其描述为一个多步骤过程,需要尽可能多的交换次数,这将导致有序且明确的最终结果,无论对谁而言。


下一主题回文树