Tikz - 二项式树中的重叠节点

Tikz - 二项式树中的重叠节点

我是 Tikz 新手,我想用 tikz 库自动机绘制二项树。其他问题建议使用库定位,并使用语法 right=of (node) 而不是 right of=node。我得到了以下树(节点 5 和 6 重叠)。有没有一种简单的方法可以自动将节点 5 稍微向左移动一点,将节点 6 向右移动一点,而无需调整距离和其他参数?(因为解决方案应该可以扩展)。

\documentclass{article}

\usepackage{tikz}
\usepackage{amsmath}
\usetikzlibrary{automata}
\usetikzlibrary{calc,arrows.meta,positioning}

\newcommand{\iddots}{\reflectbox{$\ddots$}}
\begin{document}

\resizebox{\textwidth}{!}{
\begin{tikzpicture}[-latex,shorten >=1pt,auto,node distance=40mm,semithick, state/.style={circle, draw, minimum size=2cm}]
\node[state, label={$\tilde{S}^1$}](1){1};
\node[state](2)[below left=of 1] {2};
\node[state](3)[below right=of 1] {3};

\node[state](4)[below left=of 2] {4};
\node[state](5)[below right=of 2] {5};
\node[state](6)[below left=of 3] {6};
\node[state](7)[below right=of 3] {7};


\path[->] (1) edge [swap] node {$1-p$}(2)
      ;
       
\end{tikzpicture}}
\end{document}

在此处输入图片描述

答案1

使用专门用于绘制树的包来绘制forest树,树的代码会变得更简单、更短。

编辑:考虑到 OP 在评论中的请求,一些边缘应该有虚线图案。

\documentclass[border=3.141592]{standalone}
%\documentclass{article}
\usepackage{forest}
\usetikzlibrary{arrows.meta}

\begin{document}
    \begin{forest}
for tree={
% nodes
    circle, draw, semithick,
    minimum size=1.3em, inner sep=0pt,
    math content,
% tree
    l sep =12mm,
    s sep = 6mm,
/tikz/arr/.style = {draw=cyan!60, -{Triangle[angle=45:2pt 3]}, shorten >=1pt},
% for the case when you like to have
% all edges to bottom nodes dashed; 
% using this, remove next code line with edge = arr,
%if level = 1{edge=arr}{edge={arr, dashed}}, 
     edge = arr,
        },
%% edge labels
/tikz/ELS/.style = {% Edge Label Style
              pos=0.5, node
              font=\footnotesize, text=blue, anchor=#1},
EL/.style={if n=1{edge label={node[ELS=east]{$#1$}}}
                 {edge label={node[ELS=west]{$#1$}}}}
%%%% diagram body
[1, label=$\tilde{S}^1$
    [2, EL=1-p
        [4,edge=dashed]
        [5,edge=dashed]
    ]
    [3, EL=p
        [6]
        [7]
    ]
]
    \end{forest}
\end{document}

在此处输入图片描述

答案2

这里的问题是您的节点距离始终相同,因此存在重叠。我建议您使用创建树child nodes并为每个级别设置sibbling distance。这样您就可以控制节点的位置。

二叉树正在进行中

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}

\begin{document}

    \begin{tikzpicture}[%
        auto,
        semithick,
        edge from parent/.style={draw=blue,-latex,shorten >=1pt},
        dashedge/.style={draw=blue,-latex,shorten >=1pt,dashed},
        state/.style={circle, draw=black, minimum size=1cm},
        level distance=3cm,
        level 1/.style={sibling distance=6cm},
        level 2/.style={sibling distance=2.5cm}]
        
    \node[state, label={$\tilde{S}^1$}](ROOT){1}
        child   {node[state](1-1) {2}
                child {node[state](2-1){4} edge from parent[dashedge]} %<--- CHANGE HERE
                child {node[state](2-2){5} edge from parent[dashedge]} %<--- CHANGE HERE
                }
        child   {node[state](1-2) {3}
                child {node[state](2-3){6}}
                child {node[state](2-4){7}}
                };
    \end{tikzpicture}
\end{document}

既然您要求具有缩放的可能性,您可以看到只有两个参数需要更改,以便您可以根据缩放比例来解析它们。

编辑

我增加了绘制不同类型边的可能性。

相关内容