[英]Find the swapped nodes in binary search tree
二進制搜索樹的兩個節點被交換。
輸入樹:
10
/ \
5 8
/ \
2 20
在上面的樹中,必須交換節點20和8以固定樹。
輸出樹:
10
/ \
5 20
/ \
2 8
我按照這里給出的解決方案。 但我覺得解決方案不正確,因為:
根據網站:
交換節點在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.所以這是正確的解決方案還是我遺漏了什么?
是。 這是考慮到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是被交換的兩個元素。
關注@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]出現在后面,再次打破排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.