在二叉搜索树中查找交换节点

时间:2013-11-09 22:43:16

标签: algorithm data-structures binary-search-tree

二进制搜索树的两个节点被交换。

输入树:

     10
    /  \
   5    8
  / \
 2   20

在上面的树中,必须交换节点20和8来修复树。

输出树:

     10
    /  \
   5    20
  / \
 2   8

我按照here中给出的解决方案。但我觉得解决方案不正确,因为:

根据网站:

  
      
  1. 交换节点在BST的inorder遍历中不相邻。

         

    例如,节点5和25在 {3 5 7 8 10 15 20 25} 中交换   给定树的inorder遍历是 3 25 7 8 10 15 20 5 如果我们   仔细观察,在顺序遍历期间,我们发现节点7较小   在此保存节点25的上下文   (上一个节点)。再次,我们发现节点5小于   这一次,我们保存节点5的上下文(当前节点)   节点)。最后交换两个节点的值。

  2.   

所以我的观点是,如果它考虑25因为它大于7而不是它应该考虑20因为它也大于5.所以这是正确的解决方案还是我遗漏了什么?

2 个答案:

答案 0 :(得分:2)

是。它正在考虑25因为它大于7.但是,它应该也考虑20,因为它也大于5.相反,它应该考虑5因为它小于20。

这个例子不是很好,因为原始数组中5的位置是最后一个。让我们考虑一个排序数组{1, 2, 3, 4, 5}。交换2和4,然后我们得到{1, 4, 3, 2, 5}。如果交换排序数组中的两个元素(不相邻),对于像(A[i], A[i+1])这样的所有对,将会有两个错误顺序的对,即降序。对于{1, 4, 3, 2, 5},我们有(4, 3)对和(3, 2)对。假设我们有(A[p], A[p+1])对和(A[q], A[q+1])对,A[p] > A[p+1]A[q] > A[q+1],我们可以声称它是A[p]A[q+1]被交换。在{1, 4, 3, 2, 5}的情况下,它被交换为4和2。

现在回到示例3 25 7 8 10 15 20 5,其中25, 720 5是错误顺序中唯一的两对。然后25和5是被交换的两个元素。

答案 1 :(得分:1)

遵循@jeffreys的表示法,

  

如果我们具有对(A [p],A [p + 1])和对(A [q],A [q + 1]),则A [p]> A [p + 1]和A [q]> A [q + 1],我们可以声称它是A [p]和A [q + 1]被交换

您知道只有一次交换,这会在排序顺序中产生2个差异,或者如果它们相邻则只产生一个差异。让我们说p< q,所以A [p],A [p + 1]是第一个下降对,而q是第二个。

  • 如果没有第二对夫妇,那么交换第一对夫妇就可以修复这棵树,那就是容易的部分。否则我们知道有两个不相邻的节点。

  • 在A [p]和A [p + 1]之外,让我们说A [p + 1]是不合适的。由于这是第一对夫妇,我们必须将A [p + 1]向前移动到第二对夫妇,但这意味着它仍然会比原来的A [p]小,所以我们不会创建一个排序的数组。因此,我们必须选择A [p]。

  • 同样适用于A [q]和A [q + 1],假设A [q]不合适,这意味着我们必须向后移动它,它仍然是大于A [q + 1]后来出现,再次打破排序。