不使用任何额外的空间将二进制树转换为二进制搜索树。我提出了以下算法,但它不起作用。
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)答案 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
添加叶节点是安全的,因为我们永远不会再访问它,因此我们可以覆盖其left
和right
指针。