问题:二进制搜索树(BST)的两个节点被交换。修正(或纠正)BST而不改变其结构。
我已经搜索了很多,发现大多数解决方案都假设BST没有任何重复值,这使得查找交换元素变得非常简单。但是我的问题是如果BST中有重复的值,如何找到交换的元素。我找不到处理这种情况的任何解决方案,希望有人能给出一个算法来解决这个问题。
感谢。
答案 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)
它应该适用于您的问题。如有任何问题,请告诉我,如果遗漏了某些内容,我会修改算法。