【问题标题】:Side-by-side binary trees in GraphVizGraphViz 中的并排二叉树
【发布时间】:2015-09-02 04:48:09
【问题描述】:

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

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

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

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

这不是我想要的完全平衡的方式,但它非常可行。

现在我想要多棵树并排。这是我尝试过的:

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

每棵树的格式都正确,但它们重叠。

确定将两者结合起来会奏效吗?

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

这里是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;
}

【问题讨论】:

    标签: tree graphviz dot


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢你,这是我前进的方向。我仍然希望树看起来平衡(用所需图片更新问题)。在您的左侧树中,最底部的两个节点应该向左移动一点。如果我弄清楚一个确切的顺序,我会在这里发布。
    猜你喜欢
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 2013-02-07
    • 1970-01-01
    相关资源
    最近更新 更多