1. 程式人生 > >LeetCode 重構二叉搜尋數,即找出兩個被交換的節點

LeetCode 重構二叉搜尋數,即找出兩個被交換的節點

題意:二叉搜尋樹中,有兩個結點的位置被交換了,請找出這兩個結點並交換回來。

“直觀的想法可能是中序遍歷一遍二叉樹,得到一個有序的二叉樹,然後找出其中逆序的地方,交換回來就好了。但這樣空間複雜度就是O(n),題目要求O(1)。

我們來分析下有哪些情況:1) 被交換的兩個結點相鄰,如124356,這樣只需要把相鄰的3和4交換回來即可;2) 被交換的兩個結點不相鄰,如163452,這樣我們需要找出兩個逆序的地方,63和52,並交換第一個逆序的前者和第二個逆序的後者。”(http://blog.csdn.net/ljiabin/article/details/44514651該博主很認真解釋了一下,不然光看程式還真看不懂)。因為這兩種情況存在,而且這可二叉樹只有兩個節點被交換了,所以我們需要定位這兩個節點,而不是將相鄰節點一對一對的交換達到這種效果。這一點也是最精妙的地方,程式中mistake1記錄的最底下出錯的節點,mistake2記錄的是中序遍歷中較mistake1後面的節點。