使用C将二进制树转换为二进制搜索树

时间:2011-03-29 04:49:52

标签: c binary-tree binary-search-tree in-place

不使用任何额外的空间将二进制树转换为二进制搜索树。我提出了以下算法,但它不起作用。

BTtoBST(节点* root)

1.如果root为NULL,则返回

2.else current = root

3.if(current-> left> current)swap(current-> left,current)

4.if(current-> right< current)swap(current-> right,current)

5目前=电流 - >左

6如果是current,则转到3!= NULL否则转到4

7.current =电流 - >右

提前致谢

PS:我看到了这个链接,但没有多大帮助! Convert Binary Tree -> BST (maintaining original tree shape)

2 个答案:

答案 0 :(得分:1)

您可以交换节点,包括子树(不仅仅是节点内容),就像在AVL树http://en.wikipedia.org/wiki/AVL_tree

中一样

只要违反BST约束就继续交换,在每次交换后重新开始从root进行深度优先搜索。

答案 1 :(得分:0)

执行树的后序(自下而上)遍历,获取被访问的节点并将其插入到BST中。

“没有任何额外空间”会阻止递归吗?

如果没有,那么就像:

# top level call passes null for bst
bt_to_bst (root, bst)
  # nothing to add to bst; just return it
  if null(root) -> return bst
  # if this is a leaf node, stick it into the BST
  if null(root->left) && null(root->right)
    return bst_insert(bst, root)
  # otherwise add all of left subtree into the bst and then the right tree
  bst = bt_to_bst (root->left, bst);
  return bt_to_bst (root->right, bst);

bt_to_bst是一个过滤操作;它需要一个现有的bst并返回一个新的,并添加了给定的节点。

bst添加叶节点是安全的,因为我们永远不会再访问它,因此我们可以覆盖其leftright指针。