【问题标题】:Find the swapped nodes in binary search tree在二叉搜索树中找到交换的节点
【发布时间】:2023-04-03 08:27:01
【问题描述】:

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

输入树:

     10
    /  \
   5    8
  / \
 2   20

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

输出树:

     10
    /  \
   5    20
  / \
 2   8

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

根据网站:

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

    例如,节点 5 和 25 交换为 {3 5 7 8 10 15 20 25}
    给定树的中序遍历是 3 25 7 8 10 15 20 5 如果我们 仔细观察,在中序遍历过程中,我们发现节点 7 更小 比之前访问过的节点25。这里保存节点25的上下文 (上一个节点)。同样,我们发现节点 5 小于 上一个节点 20。这一次,我们保存节点 5 的上下文(当前 节点)。最后交换两个节点的值。

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

【问题讨论】:

  • @downvoter 不要放荡不羁,敢于评论。

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


【解决方案1】:

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

这个例子不是很好,因为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 是被交换的两个元素。

【讨论】:

  • Suppose we have pair (A[p], A[p+1]) and pair (A[q], A[q+1]), such that A[p] > A[p+1] and A[q] > A[q+1], we can claim that it is A[p] and A[q+1] being swapped 你如何证明你的观点。
【解决方案2】:

遵循@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

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

  • 在 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] 后出现,再次破坏排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-24
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    相关资源
    最近更新 更多