Tree GraphViz中的并排二叉树

Tree GraphViz中的并排二叉树,tree,graphviz,dot,Tree,Graphviz,Dot,我正在尝试将2个(或理想情况下为N个)断开连接的二叉树并排格式化,我希望格式对于二叉树来说是“正确的”,大致如下所示: 即使某些节点丢失,其余节点也应保持在原来的位置 我使用名为tree.gv的脚本为一棵树生成了这种平衡的近似值: 这不是我想要的完美平衡,但它非常可行。 现在我想要多棵并排的树。以下是我尝试过的: dot trees.dot | neato -n -Goverlap=false -Tpdf -o tree.pdf 正确地并排排列,但底部的黑色叶子应该向右张开,为它们失踪的兄

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

即使某些节点丢失,其余节点也应保持在原来的位置

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

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

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

dot trees.dot | neato -n -Goverlap=false -Tpdf -o tree.pdf
正确地并排排列,但底部的黑色叶子应该向右张开,为它们失踪的兄弟姐妹留出空间。

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

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

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

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

要防止独立树或树枝水平重叠,必须使用簇(请参见我的答案)


谢谢你,这是我前进的方向。我仍然希望树看起来平衡(用所需图片更新问题)。在左边的树中,最底部的两个节点应该向左移动一点。如果我找出一个确切的顺序,我会把它贴在这里。
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;
}
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;
    }
}