使用 tikz-trees 创建第二棵树,它与第一棵树共享一些节点

使用 tikz-trees 创建第二棵树,它与第一棵树共享一些节点

我正在写一篇关于二叉树的几种操作的论文,过去几周我发表了很多与二叉树相关的帖子。目前我陷入困境,因为我需要自定义之前答案中提出的一个树模板,特别是这个答案

我想要实现的结果是下面的树效果。

在此处输入图片描述

这是我想在之前的效果之前放置的树

\documentclass[12pt, margin=3mm]{standalone}
\usepackage{forest}
\usetikzlibrary{arrows.meta,
                backgrounds,
                fit}

\begin{document}
    \begin{forest}
for tree = {
% nodes
    circle, draw, fill=gray!30,
    minimum size=1.5em, inner sep=0pt, outer sep=0pt,
/tikz/every label/.style = {font=\tiny},
/tikz/FIT/.style = {draw, very thick, rounded corners, fill=gray!30,
                    inner sep=4pt, inner ysep=8pt, yshift=-4pt,
                    fit=#1},
% tree
/tikz/every edge/.style={draw=gray, -Straight Barb, 
                         -Straight Barb, shorten >=3pt, shorten <=3pt,
                         bend angle = 15},% style for bended arrows
    edge=semithick,
    l sep=4mm,
    s sep=12mm,
    where level=3{l sep=11mm}{},% at level 3 increase l sep
    where level=4{no edge, very thick, fill=white}{},
            }% level 4 is the lowest
[11, label=below:{1:[0,7]},  name=t0
    [13, label=below:{2:[0,3]},  name=t11
        [17, label=below:{4:[0,1]},  name=t21
            [18, thick, label=below:{8:[0,0]}
                [18, label=below:0]
            ]
            [17, draw=none, fill=gray,thick, label=below:{9:[1,1]},  name=t31
                [17, label=below:1, name=n1]
            ]
        ]
        [13, draw=none,fill=gray, label=below:{5:[2,3]}
            [13, very thick, label=below:{10:[2,2]}
                [13, draw=none, fill=gray, label=below:2]
            ]
            [19, very thick, label=below:{11:[3,3]}
                [19, label=below:3, name=n3]
            ]
        ]
    ]
    [11, very thick,edge=thick, label=below:{3:[4,7]}
        [11, thick,edge=thick,
            [15, thick,edge=thick,
                [15, label=below:4]
            ]
            [11, very thick,edge=thick,
                [13, label=below:5]
            ]
        ]
        [20, very thick,edge=thick,
            [20, very thick,edge=thick,
                [13, label=below:6]
            ]
            [99, very thick,edge=thick,,
                [13, label=below:7]
            ]
        ]
     ]
]
\end{forest}
\end{document}

换句话说,我需要在图中制作一棵单独的树(黄色),这样我就可以将一些节点附加到前一棵树(蓝色)的某些节点上。

我正在尝试模拟一个持久数据结构,并且该数据结构重用旧树的某些节点来生成一棵新树(部分新树)

我的想法是制作一棵单树并将节点作为拱门连接起来,但它与我的实际代码看起来非常糟糕,而且我很难进行定制以激活我的对象。

答案1

  • 有什么问题?如何重现显示的图像?
  • 您是否希望将 MWE(来自您上一个问题的答案)作为起点?如果是这样,那么您需要执行以下操作:
    • 删除所有节点的标签
    • 删除every label样式定义
    • 删除FIT样式定义
    • 删除every edge样式定义
    • 删除最低(4)层的节点
    • 删除 4 级定义
    • 现有的根节点替换为[,phantom
  • 采取上述措施后获得的MWE应该产生以下结果:

在此处输入图片描述

  • 下一步是重新设计左边的树:
    • 在左侧分支中,将数字 13、17 18 替换为1'2'3'它们在图像中以黄色节点表示。
    • 为该节点添加新的填充颜色
    • 此后树体的前四行是:
[,phantom
    [1', fill=yellow, name=t11
        [2', fill=yellow, name=t21
            [3',fill=yellow]
  • 删除树底部编号为 13 和 19 的节点。现在树应该如下所示:
  • 为了完成左树的重新设计,您需要将编号为 17 和 13 的节点设为幻影节点:
[,phantom
    [1', fill=yellow, name=t11
        [2', fill=yellow, name=t21
            [3',fill=yellow]
            [,phantom]
        ]
        [,phantom]
    ]% end of left tree
  • 现在树应该看起来像这样:

在此处输入图片描述

  • 对于右边的树你只需要执行以下操作:
    • 用新内容替换现有内容,显示在图像上
    • 给编号为 5 和 3 的节点命名:
    ]% end of left tree
    [1
        [2
            [4]
            [5,name=t32]
        ]
        [3, name=t22
            [6]
            [7]
        ]
     ]% end of right tree
  • 最后,您需要先在左树和右树之间画线:
]% end of tree
\draw[very thick, orange]   (t11) -- (t22)
                            (t21) -- (t32);
  • 完成所有描述的操作后,您应该获得以下结果:

在此处输入图片描述

  • 如果结果令人满意,那么您的工作就完成了。当然,您可以通过遵循序言中的更改来稍微美化结果树\for tree
    • s sep=12例如 更改为s sep=3(节点之间的水平(兄弟)距离变得更小)
    • 向右树添加选项fit=band(用于增加树之间的距离)
  • 考虑到上述变化,完整的 MWE 是:
\documentclass[12pt, margin=3mm]{standalone}
\usepackage{forest}
\usetikzlibrary{arrows.meta,
                backgrounds,
                fit}

\begin{document}
    \begin{forest}
for tree = {
% nodes
    circle, draw, fill=gray!30,
    minimum size=1.5em, inner sep=0pt, outer sep=0pt,
% tree
    edge=semithick,
    l sep=4mm,
    s sep=3mm,      % <------- changed
            }
[,phantom
    [1', fill=yellow, name=t11
        [2', fill=yellow, name=t21
            [3',fill=yellow]
            [,phantom]
        ]
        [,phantom]
    ]% end of left tree
    [1,fit=band     % <------- added
        [2, 
            [4]
            [5,name=t32]
        ]
        [3, name=t22, 
            [6]
            [7]
        ]
     ]% end of right tree
]% end of tree
% connection between left and right tree
\draw[very thick, orange]   (t11) -- (t22)
                            (t21) -- (t32); 
\end{forest}
\end{document}

在此处输入图片描述

相关内容