当存在重复时,在BST中查找交换的元素

时间:2014-08-17 03:10:19

标签: duplicates binary-search-tree

问题:二进制搜索树(BST)的两个节点被交换。修正(或纠正)BST而不改变其结构。

我已经搜索了很多,发现大多数解决方案都假设BST没有任何重复值,这使得查找交换元素变得非常简单。但是我的问题是如果BST中有重复的值,如何找到交换的元素。我找不到处理这种情况的任何解决方案,希望有人能给出一个算法来解决这个问题。

感谢。

1 个答案:

答案 0 :(得分:0)

给定:交换任意两个节点的BST

如果给定的树仍然是二叉搜索树,则您无法知道哪些节点被交换(因为,我们没有关于树的先前状态的任何其他信息)

关键点:交换后如果在任何两点违反BST属性,那么我们就可以识别出2个交换节点。

我们可以修改算法,找出给定的二叉树是否为bst(使用min-max方法)来解决这个问题:

DriverFunction (TreeNode *root)
{
    TreeNode *swapped1 = NULL
    TreeNode *swapped2 = NULL


    FindSwapped    ( root, 
                     swapped1, 
                     swapped2, 
                     INT_MIN, 
                     INT_MAX)

    if (swapped1 && swapped2)
        Print Swapped Nodes
        // If you also want to correct the BST,
        // Swap the data of nodes pointed out by swapped1 & swapped2
}

void FindSwapped          (TreeNode *root,
                           TreeNode *swapped1,
                           TreeNode *swapped2,
                           int       minval,
                           int       maxval)
1. if (NULL == root)
2.     return
3. if (root->data <= minval || root->data > maxval)
4.    if (NULL != swapped1)
5.        swapped2 = root
6.        return
7.    else 
8.        swapped1 = root
9. FindSwapped (root->LC, 
                swapped1,
                swapped2,
                minval,
                root->data)
10.FindSwapped (root->RC,
                swapped1,
                swapped2,
                root->data,
                maxval)

它应该适用于您的问题。如有任何问题,请告诉我,如果遗漏了某些内容,我会修改算法。