Zeichnen von BäumenSeminar Graphenzeichnen SS03von Lina Wolf
Zeichnen von Bäumen
1. Was ist ein Baum?2. Generelle Wünsche3. Ästhetische Regeln4. Geschichtete Zeichnungen5. Andere Algorithmen
Was ist ein Baum?•Baum wie üblich definiert•m-ärer Baum: max m Kinder•Kinder ev. geordnet•Kind von Binärbaum links oder rechts•freier Baum:ohne Wurzel
Generelle Wünsche•Planar•Gitter•gerade Linien•(streng) aufsteigend •erhaltene Ordnung•aufgeräumt
Ästhetische Regelnnach Tilford und Reingold
1. Knoten gleicher Höhe auf gerader Linie, diese parallel2. Linkes Kind links von Mutter und re3. Mutter zentriert über Kindern4. Isomorphismus, gleiche Teilbäume gleich
1. Ästhetische RegelKnoten gleicher Höhe auf gerade Linie, diese parallel
geschichtete Zeichnungen: Knoten.y = Knoten.Tiefe Algorithmen nur für X-Koordinaten
2. Ästhetische RegelLinkes Kind links von Mutter und re
nur in geordneten Binärbäumen
(m>2)-ären Bäumen: 1 Kind direkt unter Mutter
3. Ästhetische RegelMutter zentriert über Kindern
4. Ästhetische RegelIsomorphismus, gleiche Teilbäume gleich
Geschichtete Zeichnungen•Knoten.y = Knoten.Tiefe•firstWalk•Verschiebung Teilbaum nur seiner Wurzel gespeichert. •secondWalk:Verschiebungen aufsummiert
secondWalksecondWalk(knoten, level, sum){ knoten.x = knoten.x + sum; knoten.y = level; für(alleKinder){ secondWalk(kind, level+1, sum + knoten.verschiebung); }}
Geschichtete Zeichnungen
•Algorithmus WS•verbesserter WS•Algorithmus TR•Algorithmus von Walker•verbesserter Walker
Algorithmus WSWetherell and Shannon
firstWalk(knoten, level)für (alleKnoten(post-Order)){ wenn(Knoten hat n Kinder){ n == 0: Knoten.x nächsteX(level); n == 1: Knoten.x r/l Mutter n == 2: zentriere Knoten ü. Kinder } wenn (Knoten.x < nächsteX(level)){ Knoten.x nächsteX(level) Kinder(Teilbäume) schiften}}
Algorithmus WSWetherell und Shannon
Achtung: Ästhetische Regel 4 (Isomorphismus) wird nicht beachtet.
Platz verschenkt
veränderter WS
Wetherell und Shanon präsentieren veränderten Algorithmus (l) Mutter nicht mehr über Kindern zentriert.
Algorithmus TRTilford und Reingold
Alle vier ästhetischen Regeln beachtet
Algorithmus TRTilford und Reingold
•Laufzeit O(n)•beide Teilbäume unabhängig fertig, •nur noch verschieben•Wurzeln nebeneinander plaziert•auseinander schieben bis kein Knoten mehr berührt
Algorithmus TRTilford und Reingold
Problem: wie Rändern folgen?Der linken Kante zu folgen reicht nicht aus:
Idee:nächster Knoten Kind von diesem oder dieser Blatt. Bei Blatt Pointer auf nächsten Knoten
Algorithmus TRFür m-äre Bäume
Links/rechts klebendes Problem
Algorithmus TRFür m-äre Bäume, Spiegelung
Algorithmus von Walker
•Verbesserung TR •Unterbäume gut verteilt •Laufzeit immer noch O(n)
laut Walker(!!!)
Algorithmus Walker
firstWalk Alg. Walkervoid firstWalk(knoten, level){ knoten.x = 0; wenn(knoten.hatLSchw()){
knoten.x = knoten.lSchw.x + DIS; } wenn(!knoten.istBlatt()){
für(alleKinder){ firstWalk(kind, level + 1);}
firstWalk Alg. Walker
m =(lKind.x + rKind.x)/2; wenn(knoten.hatLSchw()){ knoten.verschiebung = knoten.x - m; apportion(knoten, level); } sonst { // knoten linkestes Kind knoten.x = m; //zentriert ü. Kindern }}
Apportion Alg. Walker•Apportion(..) verhindert links/ rechts kleben. zwischen linker und rechter Teilbaum Bäume gleichmäßig verteilt •Wird für jeden Knoten aufgerufen•Aber Laufzeit Apportion nicht konstant=> Laufzeit Walker O(n2/3)
Apportion Alg. Walkervoid apportion(knoten, level){ eins = knoten.erstesKind(); nachbar = linkerNachbar(eins); tiefe = 1; solange(eins != ø && nachbar != ø){ rPosi = eins.posi(tiefe); lPosi = nachbar.posi(tiefe); vNachbar = nachbar.Vorfahr(tiefe); abstand = rPosi + TB_TRENN - lPosi; wenn(abstand > 0){
nrSchw = knoten.nrLSchw(vNachbar);
Apportion Alg. Walker wenn(knoten.hatSchw(vNachbar)){ teil = abstand / nrSchw; für(alle Schwestern bis vNachbar){ schwester.x += abstand;
schwester.verschiebung += abstand abstand = abstand-teil;
}}} wenn(eins.istBlatt()){ eins = knoten.holLinkestes(knoten, 0, tiefe); } sonst { eins = erstes.erstesKind(); } nachbar = linkerNachbar(eins); //fehlt bei
//Walker, macht sonst keinen Sinn}}
Apportion
knoten
erstes
nachbar
vNachbar
Tiefe = 1abstand > 0
Apportion
knotenvNachbar
erstesnachbar
Tiefe = 2abstand > 0
Apportion
knotenvNachbar
erstesnachbar
Tiefe = 3abstand = 0
Apportion
knotenvNachbar
erstesnachbar
Tiefe = 4abstand = 0
Apportion
knotenvNachbar
erstesnachbar
Tiefe = 5
Ø Fertig!
Verbesserter Walker O(n)Buchheim, Jünger und Leipert weisen nach, dass Walker in worst-case (n2/3)schlagen anderen Algorithmus vor, verändertes apportion
Verändertes Apportion•Rändern folgen: wie R und T (Pointer)•Vorfahren finden: rechter bekannt, linker nach Schieber und Vishkin O(1)•Teilbäume zählen: rechter - linker +1•alle Teilbäume in weiterer Traversierung verschieben=> Apportion konstant
Laufzeit linearer Walker
Andere Algorithmen
•Radiale Zeichnungen•HV-Zeichnungen•rechtsschwere HV- Zeichnungen
Radiale Zeichnungen
•Häufig für freie Bäume•Algorithmen ähnlich geschichtete
Radiale Zeichnungen•Teilbäume beschränkt auf konvexe Ausschnitte•sonst nicht planar•Tangente durch Knoten Teilbaum zwischen a und b
HV-Zeichnungen
HV-ZeichnungenHV = horizontal-vertical
• Nur für Binärbaume, unterstützt Gitterzeichnung•Ordnung kann erhalten bleiben• die die Teilbäume umgebenen Rechtecke schneiden sich nicht
HV-AlgorithmusDivide: Rekursiv linken und rechten Teilbaum konstruierenConquer: horizontale (a) oder vertikale (b) Kombination
•Ordnung nicht erhalten•Höhe max log(n)•Conquer: mit horizontaler Kombination größerer Teilbaum rechts von anderem
rechtsschwere HV- Zeichnungen