二进制搜索树的两个节点被交换。
输入树:
10
/ \
5 8
/ \
2 20
在上面的树中,必须交换节点20和8来修复树。
输出树:
10
/ \
5 20
/ \
2 8
我按照here中给出的解决方案。但我觉得解决方案不正确,因为:
根据网站:
- 醇>
交换节点在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的上下文(当前节点) 节点)。最后交换两个节点的值。
所以我的观点是,如果它考虑25因为它大于7而不是它应该考虑20因为它也大于5.所以这是正确的解决方案还是我遗漏了什么?
答案 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, 7
和20 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]后来出现,再次打破排序。