转换二叉树 - > BST(保持原始树形)

时间:2010-08-20 14:05:53

标签: algorithm data-structures tree binary-tree

我有一个某种形状的二叉树。我想将其转换为相同形状的BST搜索树。可能吗?

我尝试过像

这样的方法
  • 二元树的有序遍历&将内容放入数组中。然后将其映射到BST,记住条件(左val< = root< = right val)。这适用于某些情况,但对其他情况不利。

P.S。:我看了一眼 - Binary Trees question. Checking for similar shape。但是,比较2 BST的形状相似性很容易。

4 个答案:

答案 0 :(得分:5)

简短的回答是:你做不到。 BST要求节点遵循左边的规则< = current<对。在您链接的示例中:http://upload.wikimedia.org/wikipedia/commons/f/f7/Binary_tree.svg,如果您尝试使用相同的shap构建BST,则会发现您不能。

但是,如果你想扩展BST的定义,以便它允许left< = current< = right(注意这里允许当前< = right,与更严格的定义相对应)你可以。对所有元素进行排序并将它们粘贴在一个数组中。现在进行有序遍历,用节点中的每个元素替换节点上的值。这是一些伪代码:

// t is your non-BST tree, a is an array containing the sorted elements of t, i is the current index into a
index i = 0
create_bst(Tree t, Array a)
{
  if(t is NIL)
    return;
  create_bst(t->left, a)
  t->data = a[i]
  i++
  create_bst(t->right, a)
}

然而,结果将不是真正的BST。如果你想要一个尽可能接近原始形状的真实BST,那么你再次将元素放在一个有序数组中,但这次将它们插入到BST中。插入它们的顺序由原始树的子树大小定义。这是一些伪代码:

// left is initially set to 0
create_true_bst(Tree t, BST bt, array a, index left)
{
  index i = left + left_subtree(t)->size
  bt->insert(a[i])
  if(left_subtree(t)->size != 0)
  {
    create_true_bst(t->left, bt, a, left)
    create_true_bst(t->right, bt, a, i + 1)
  }
}

但这并不能保证形状相同。

答案 1 :(得分:1)

提取树的所有元素,然后对其进行排序,然后使用递归的inorder过程来替换值。

答案 2 :(得分:0)

如果正确实施,您所描述的方法可以保证正常工作。二叉树上的遍历顺序是唯一的,并定义元素的排序。如果按值对元素进行排序,然后根据该顺序将它们粘贴,那么

总是如此
left subtree <= root <= right subtree

对于每个节点,假定这是您遍历它们的顺序,并且假设您按顺序对它们进行排序。

答案 3 :(得分:0)

我只会做两次有序遍历。在第一次遍历中,从树中获取值并将它们放入堆中。在第二个中,从堆中按顺序获取值并将它们放入树中。这在 O(n·log n)时间和 O(n)空间中运行。