Az egyik módja annak, hogy gondolni ezt a problémát, hogy az a tény, hogy egy inorder séta a fa fog az összes elemet rendezett sorrendben. Ha képes felismerni eltérések a sorba rendezett során ez a séta, akkor próbálja megkeresni a két elem, amelyek a rossz helyen.
Lássuk, hogyan kell ezt csinálni egy egyszerű rendezett tömbben az első, majd használja a algoritmust építeni valamit, ami működik a fán. Szemléletesen ha elindul egy rendezett tömbben, majd csere két (nem egyenlő!) Elemek, akkor a végén néhány számát a tömb elemeinek, hogy a helyén. Például, mivel a tömb
1 2 3 4 5
Ha cserélni a 2 és 4, akkor a végén ezzel a tömböt:
1 4 3 2 5
Hogyan tudnánk felismerni, hogy a 2. és a 4. helyet cseréltek itt? Nos, mivel a 4. a nagyobb a két elem, és cserélték lefelé, akkor nagyobbnak kell lennie mind az elemek körül. Hasonlóan, mivel 2-t cserélték fel, hogy legyen kisebb, mint mind az elemek körül. Ebből azt a következtetést lehet levonni, hogy a 2. és a 4. helyet cseréltek.
Azonban ez nem mindig működik megfelelően. Tegyük fel például, hogy felcseréljük 1 és 4:
4 2 3 1 5
Itt, a 2 és 1 kisebb, mint a szomszédos elem, és mindkét 4 és 3 nagyobb, mint az övék. Ebből azt lehet mondani, hogy két ilyen négy valahogy kicserélték, de ez nem egyértelmű, melyik kellene felcserélni. Azonban, ha vesszük a legnagyobb és a legkisebb ezen értékek (1, illetve 4), akkor a végén kezd a pár, hogy újra cserélték.
Általánosabban, hogy megtalálják azokat az elemeket, kicserélték a sorozat, meg akarja találni
- A legnagyobb helyi maximum a tömbben.
- A legkisebb lokális minimum a tömbben.
Ez a két elem a helyén, és meg kell felcserélni.
Most nézzük gondolni, hogyan lehet alkalmazni ezt a fákat. Mivel a inorder séta a fa fog a rendezve szekvencia a két elem elromlott, az egyik lehetőség az lenne, hogy járni a fa, a rögzítés inorder elemsorozatával találtunk, akkor a fenti algoritmus. Vegyük például az eredeti BST:
20
/ \
15 30
/ \ / \
10 17 25 33
/ | / \ / \ | \
9 16 12 18 22 26 31 34
Ha linearizálásában ez egy tömb, megkapjuk
9 10 16 15 12 17 18 20 22 25 26 30 31 33 34
Figyeljük meg, hogy a 16-nél nagyobb a környező elemeket, és hogy a 12 kisebb, mint az. Ez azonnal azt mondja, hogy a 12 és 16 kicserélték.
Egy egyszerű algoritmus megoldja ezt a problémát, ezért az lenne, hogy csinál egy inorder séta a fa linearizáljuk egy szekvencia, mint egy vectorvagy deque, akkor beolvasni, hogy a sorozatot, hogy megtalálják a legnagyobb helyi maximum, és a legkisebb lokális minimum. Ez fut O (n) időben, O (n) térben. Egy bonyolultabb, de több helyet-hatékony algoritmust az lenne, hogy csak nyomon követni a három csomópont egy időben - az aktuális csomópont, elődje, és utódja -, amely csökkenti a memória használat, hogy O (1).
Remélem ez segít!