我正在写一篇关于二叉树的几种操作的论文,过去几周我发表了很多与二叉树相关的帖子。目前我陷入困境,因为我需要自定义之前答案中提出的一个树模板,特别是这个答案
我想要实现的结果是下面的树效果。
这是我想在之前的效果之前放置的树
\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'
它们在图像中以黄色节点表示。 - 为该节点添加新的填充颜色
- 此后树体的前四行是:
- 在左侧分支中,将数字 13、17 18 替换为
[,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}