Jeden způsob, jak přemýšlet o tomto problému je použít k tomu, že nezbytného chůze od stromu bude vyrábět všechny prvky v seřazeném pořadí. Pokud můžete odhalit odchylky od seřazeném pořadí při procházce, můžete se pokusit najít tyto dva prvky, které jsou na špatném místě.
Podívejme se, jak to udělat jednoduchý seřazeném poli, poté bude používat náš algoritmus vybudovat něco, co funguje na stromech. Intuitivně, pokud bychom začít s tříděným pole a poté vymění dva (non-stejné!) Elementů, skončíme s nějakým počtem prvků v matici bytí mimo mísu. Například, vzhledem k matici
1 2 3 4 5
Budeme-li vyměnit 2 a 4, skončíme s tímto polem:
1 4 3 2 5
Jak by zjistíme, že 2 a 4 byly tady vyměnil? Tak, protože 4 je větší ze dvou prvků, a byl vyměněn směrem dolů, to by mělo být větší než oba prvky kolem něj. Podobně, protože 2 byl vyměněn se, že by mělo být menší, než oba prvky kolem něj. Z toho můžeme vyvodit, že 2 a 4 byly zaměněny.
Nicméně, to nemusí vždy fungovat správně. Předpokládejme například, že máme vyměnit 1 a 4:
4 2 3 1 5
Zde, jak 2 a 1 jsou menší než jejich sousedními prvky, a to jak 4 a 3 jsou větší než jejich. Z toho můžeme říci, že dva z těchto čtyř nějak byly zaměněny, ale to není jasné, které z nich bychom měli výměnu. Nicméně, vezmeme-li v největší a nejmenší z těchto hodnot (1 až 4, v uvedeném pořadí), jsme se nakonec dostat pár, který byl prohozené.
Obecněji řečeno, najít prvky, které byly zaměněny v pořadí, chcete najít
- Největší lokální maximum v poli.
- Nejmenší lokální minimum v poli.
Tyto dva prvky jsou na svém místě a měl by být vyměněn.
Nyní se pojďme přemýšlet o tom, jak aplikovat na stromech. Vzhledem k tomu, jako nezbytného chůze stromu bude produkovat seřazené sekvenci s dvěma prvky mimo provoz, jednou z možností by bylo jít na strom, záznam nezbytného posloupnost prvků jsme našli, pak pomocí výše uvedeného algoritmu. Vezměme si například původní BST:
20
/ \
15 30
/ \ / \
10 17 25 33
/ | / \ / \ | \
9 16 12 18 22 26 31 34
Kdybychom linearizovat to do pole, dostaneme
9 10 16 15 12 17 18 20 22 25 26 30 31 33 34
Všimněte si, že 16 je větší než jeho obklopující prvky, a to 12, je menší než jeho. To nám říká, že hned 12 a 16 byly zaměněny.
Jednoduchý algoritmus pro řešení tohoto problému, a proto by bylo udělat nezbytného chůze stromu jej linearizovat do sekvence jako vectorOr deque, pak skenovat tuto sekvenci najít největší lokální maximum, a naopak nejmenší lokální minimum. To by bylo v O (n), za použití O (n) prostor. Složitější, ale více prostorově nenáročný algoritmus by bylo jen sledovat tří uzlů najednou - aktuální uzel, jeho předchůdce, a jeho nástupce - což snižuje využití paměti O (1).
Snad to pomůže!