tree - GraphViz 中的并排二叉树

标签 tree graphviz dot

我正在尝试并排格式化 2 个(或理想情况下 N 个)断开连接的二叉树,并且我希望格式化对于二叉树来说是“正确的”,大致如下:

enter image description here

即使某些节点丢失,其余节点也应保持原样。

我使用 this Stack answer 中名为 tree.gv 的脚本为一棵树生成了这种平衡的近似值。 :

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

正确地并排放置,但底部的黑色叶子应该向右张开,为失踪的 sibling 留出空间。

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;
}

最佳答案

形成树的主要技巧是使用具有高边权重的额外不可见节点,然后将其直接放置在父节点下方。出现的顺序很重要。

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

为了防止独立的树或 Twig 水平重叠,您必须使用簇(请参阅我对 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

关于tree - GraphViz 中的并排二叉树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30883310/

相关文章:

Graphviz节点样式: thicker contours?

python - 如何在 Python 中解析 DOT 文件

Graphviz dot 不适用于 OS X Yosemite

java - 创建目录树

计算 AVL 树中节点数的算法

ruby - 运行 rake erd 命令时失败 : RuntimeError: Saving diagram failed!

php - graphviz svg 自动调整大小

c++ - 三元树报错

algorithm - 使用递归提高 DFS 的时间复杂度,使每个节点仅与其后代一起工作

java - 氧点。通过注解绘制类之间的链接