2015-06-17 147 views
1

我試圖格式化2(或理想情況下N)斷開的二叉樹並排,我想格式是二叉樹「適當」,大致像所以:GraphViz中的並行二叉樹

enter image description here

即使一些節點丟失,剩下的應該留正是他們在哪裏。

我產生這種平衡的一個近似一棵樹與一個叫tree.gv腳本this Stack answer

dot one_tree.dot | gvpr -c -f tree.gv | neato -n -Tpdf -o tree.pdf 

這不是完美的平衡,我想的方式,但它是非常可行的。 enter image description here

現在我想並排多棵樹。以下是我已經試過:

dot trees.dot | neato -n -Goverlap=false -Tpdf -o tree.pdf 

正確並排側,但底部黑葉應權張開,留有餘地他們失蹤的兄弟姐妹。

dot trees.dot | gvpr -c -f tree.gv | neato -n -Tpdf -o tree.pdf 

每棵樹格式正確,但它們重疊。 enter image description here

當然,將兩者結合起來會起作用嗎?

dot trees.dot | gvpr -c -f tree.gv | neato -n -Goverlap=false -Tpdf -o tree.pdf 

enter image description here

這裏是trees.dot

digraph BST { 
    graph [center=true, margin=0.01, nodesep=0.1, ranksep=0.3, width=1,ratio=.25]; 
    node [fontname="Arial",style=filled,color="0.0 0.0 0.0",fixedsize=true,width=0.15,shape=circle,label=""]; 
    node [margin=0.01,fillcolor="lightgrey"]; 
    edge [dir=none]; 
    node [fillcolor="black"]; 
    Lower; 
    Lower -> LowerR; 
    Lower -> LowerL; 
    LowerL -> LowerLR; 
    LowerR -> LowerRR; 
    node [fillcolor="red"]; 
    Upper; 
    Upper -> UpperR; 
    Upper -> UpperL; 
} 

回答

2

主要的竅門以形成樹是使用具有高的邊權重的額外不可見節點,然後將其直接放置在父節點下。出現順序計數。

digraph BST { 
    graph [center=true, margin=0.01, nodesep=0.1, ranksep=0.3, width=1,ratio=.25]; 
    node [fontname="Arial",style=filled,color="0.0 0.0 0.0",fixedsize=true,width=0.15,shape=circle,label=""]; 
    node [margin=0.01,fillcolor="lightgrey"]; 
    edge [dir=none]; 
    node [fillcolor="black"]; 
    Lower; 
    LowerL; 
    LowerM [style=invis]; 
    LowerR; 
    Lower -> LowerR; 
    Lower -> LowerM [weight=100 style=invis]; 
    Lower -> LowerL; 
    LowerLM [style=invis]; 
    LowerLR; 
    LowerRM [style=invis]; 
    LowerRR; 
    LowerL -> LowerLR; 
    LowerL -> LowerLM [weight=100 style=invis]; 
    LowerR -> LowerRR; 
    LowerR -> LowerRM [weight=100 style=invis]; 
    node [fillcolor="red"]; 
    Upper; 
    UpperR; 
    UpperM [style=invis]; 
    UpperL; 
    Upper -> UpperR; 
    Upper -> UpperM [weight=100 style=invis]; 
    Upper -> UpperL; 
} 

enter image description here

爲了防止橫向獨立的樹木或樹枝上重疊,你必須使用羣集(見我的回答Making graphviz trees have parents centred above children

digraph BST { 
    graph [center=true, margin=0.01, nodesep=0.1, ranksep=0.3, width=1,ratio=.25]; 
    node [fontname="Arial",style=filled,color="0.0 0.0 0.0",fixedsize=true,width=0.15,shape=circle,label=""]; 
    node [margin=0.01,fillcolor="lightgrey"]; 
    edge [dir=none]; 
    node [fillcolor="black"]; 
    graph [style=invis]; 
    subgraph cluster_Lower { 
     Lower; 
     LowerL; 
     LowerM [style=invis]; 
     LowerR; 
     Lower -> LowerR; 
     Lower -> LowerM [weight=100 style=invis]; 
     Lower -> LowerL; 
     LowerLM [style=invis]; 
     LowerLR; 
     LowerRM [style=invis]; 
     LowerRR; 
     LowerL -> LowerLR; 
     LowerL -> LowerLM [weight=100 style=invis]; 
     LowerR -> LowerRR; 
     LowerR -> LowerRM [weight=100 style=invis]; 
    } 
    node [fillcolor="red"]; 
    subgraph cluster_Upper { 
     Upper; 
     UpperR; 
     UpperM [style=invis]; 
     UpperL; 
     Upper -> UpperR; 
     Upper -> UpperM [weight=100 style=invis]; 
     Upper -> UpperL; 
    } 
} 

enter image description here

+0

謝謝你,這是指引我前進。我仍然希望樹看起來平衡(更新的問題與所需的圖片)。在左邊的樹中,兩個最底部的節點應該向左移動一點。如果我找出確切的順序,我會在這裏發佈。 – supergra