【问题标题】:C++ How to convert a binary tree into a binary search tree without using extra spaceC ++如何在不使用额外空间的情况下将二叉树转换为二叉搜索树
【发布时间】:2015-12-10 06:55:44
【问题描述】:

这个 C++ 赋值要求我们创建一个二叉树并检查它是否是二叉搜索树。如果不是,那么我们需要一种算法来修复它,而无需使用额外的空间或其他数据结构。我和我的朋友都被困在找出一个合适的算法上,因为大量的在线搜索几乎没有找到任何结果。我们不太关心运行时,我们主要专注于找出如何根据给定的要求修复 BT。

链表用于创建树,但我们不知道如何实现某种算法将其转换为 BST。

任何提示将不胜感激!

【问题讨论】:

  • 平衡二叉搜索树,还是只是一个 BST?如果它只是一个二叉树,只需创建一个完全左偏的树,然后使用任意算法对元素进行排序。但我猜你正在寻找一棵平衡的树。
  • 不,它不必平衡,但你所说的任意算法到底是什么意思?

标签: c++ data-structures binary-search-tree


【解决方案1】:

按照下面给出的步骤:

  1. 检查您的二叉树T1 是否为二叉搜索树。如果是,则无需担心,否则转到步骤 2
  2. 对给定的二叉树进行后序遍历并创建另一棵树T2(将其视为二叉搜索树最初指向 NULL,表示最初为空).
  3. 在对二叉树进行后序遍历的同时,继续一个一个地删除节点,并为每个节点创建一个副本,并将该节点一个一个地插入到BSTT2中。 (注意:插入应以 BST 方式完成)

复杂性:
最坏时间复杂度:O(n2)。
空间复杂度:O(1). 常数

【讨论】:

  • 很遗憾,在修复树时我们无法创建任何新的数据结构
  • @eunoia。仔细观察,你并没有创建任何新的数据结构,你只是在修复它,没有任何额外的努力。
【解决方案2】:

您可以按照以下步骤将您的二叉树原地转换为二叉搜索树:

  1. 首先我们将二叉树转换为双向链表。做一个中序遍历,并相应地改变左右指针(left可以作为next,right作为previous),就地形成链表。

  2. 然后对链表进行就地排序(此处使用合并排序,因为它对链表进行就地排序)。

  3. 然后你可以将这个链表原地转换回树。从根开始作为链表的中间元素,并使用递归函数相应地左右移动。

这将创建一个平衡树。

【讨论】:

    猜你喜欢
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多