This text in English

Hoe verwissel je delen van een ongewortelde boom

Ongewortelde bomen zijn conceptueel ongeordend. De vertakkingen liggen vast, maar of een subboom naar links of naar rechts vertakt is niet gedefinieerd. Hoe takken komen te liggen is het toevallige resultaat van de weergave.

Soms wil je twee subbomen met elkaar verwisselen om de hele boom inzichtelijker te maken. Dat lijkt eenvoudig, maar is het soms toch niet, vanwege de manier waarop de bomen intern zijn gedefinieerd.

Stel, je hebt een clustering, daar maak je een boom van:

lnjtree -h -f 24 vb.clu > vb1.ps

En dat ziet er dan zo uit:

Bovenstaande boom zou overzichtelijker zijn als je de subboom met B en C verwisselt met de subboom met D en E. Dat kun je doen met de optie -s waaraan je twee labels meegeeft, één label uit elke subboom:

lnjtree -h -f 24 -s B D vb.clu > vb2.ps

Dan krijg je dit:

Voor de duidelijkheid, dezelfde boom 90 graden gedraait, met daarnaast de oorspronkelijke boom:

nieuwe boomoorspronkelijke boom

Alleen D en E zijn met elkaar verwisseld. Dit is niet wat de bedoeling was. Wat ging er mis? (Om precies te zijn: E is niet van plaats veranderd, en D wisselde met alle items behalve met E.)

Je moet begrijpen hoe de clustering intern er uit ziet. Elke node, elke driesprong, bestaat uit een ouder-edge en twee dochter-edges. Op één node na, die heeft geen ouder, en heeft drie dochters. Dit is de root-node. De boom zelf heeft geen root, maar in de interne representatie is die er wel, want je moet toch ergens beginnen. Op zich zou elke node de root-node kunnen zijn.

Nog eens terug naar de oorspronkelijke boom:

De blauwe cirkel geeft aan waar je twee edges met elkaar wilt verwisselen.

Waarneer je de optie -s gebruikt om twee subbomen te verwisselen, dan zoekt het programma naar die node waar twee subbomen samenkomen, zodat elke subboom één van de twee labels heeft. De gevonden node heeft de twee subbomen als dochters.

In principe kan dit elke node zijn op het pad dat de twee labels met elkaar verbindt! Op de weg van B naar D zijn dit drie nodes. En blijkbaar is het niet de door ons gewenste node in de blauwe cirkel.

Hoe los je dit op?

Je begint door het programma de optie -r mee te geven. Dan tekent het programma op de plaats van de root-node een rode stip:

lnjtree -h -f 24 -r vb.clu > vb3.ps

Dat ziet er zo uit:

De edge die van de rode stip af komt is de ouder-edge van de node in de blauwe cirkel. Je kunt geen ouder-edge met een dochter-edge verwisselen. Je kunt alleen twee dochters met elkaar verwisselen. Je kunt nu zien dat de ene dochter de subboom is met B en C, en de andere dochter de subboom met A, F, G, en H. Je kunt deze verwisselen door de labels B en A te gebruiken:

lnjtree -h -f 24 -s B A vb.clu > vb4.ps

Dat ziet er zo uit:

Tot slot kun je de optie -a gebruiken om het geheel te roteren, zodat de boom grotendeels lijkt op de oorspronkelijke boom:

lnjtree -h -f 24 -s B A -a 90 vb.clu > vb5.ps

Dan krijg je dit:

nieuwe boomoorspronkelijke boom

Merk op dat je de optie -s meerdere keren kunt gebruiken, om meerdere delen in de boom van plaats te verwisselen.