Problema con árbol y etiquetas en tikz

Problema con árbol y etiquetas en tikz

Me gustaría colocar una etiqueta en el borde de un árbol de manera que rompa el borde. Intenté algo tonto, estableciendo el fondo en blanco, pero luego la etiqueta cubre otros bordes cercanos:

Ejemplo

También parece que tengo nodos con etiquetas con 2 dígitos más grandes. ¿Cómo puedo hacer que todo sea uniforme?

Aquí está mi MWE:

\documentclass{article}
\usepackage{tikz}

\usetikzlibrary{shapes.geometric}
\begin{document}
    \begin{tikzpicture}[level/.style={sibling distance=15mm/#1}]
        \node [circle,draw] {0}
        child[very thick,red] {node [thin, black,circle,draw] {$1$} edge from parent node [fill=white] {$s_1$}}
        child[very thick,blue] {node [thin, black,circle,draw] {$2$}
            child[very thick, red] {node [thin, black,circle,draw] {$3$}}
            child[very thick, blue] {node [thin, black,circle,draw] {$4$}}
            child[very thick, orange] {node [thin, black,circle,draw] {$8$}}
            edge from parent node [fill=white] {$s_2$} }
        child[very thick,orange] {node [thin, black,circle,draw] {$6$}}
        child[very thick,orange] {node [thin, black,circle,draw] {$7$}}
        child[very thick,blue] {node [thin, black,circle,draw] {$11$}
            child[very thick, red] {node [thin, black,circle,draw] {$10$}}
            child[very thick, blue] {node [thin, black,circle,draw] {$9$}}
            child[very thick, orange] {node [thin, black,circle,draw] {$5$}}
        }
        child[very thick,red] {node [thin, black,circle,draw] {$12$}};
    \end{tikzpicture}
\end{document}

Respuesta1

Con el uso del forestpaquete el código del árbol es más corto:

\documentclass{article}
\usepackage{forest}

\begin{document}
\forestset{
  EL/.style={% abbreviation for Edge Label
             edge label={node[midway, font=\small, text=black,
                         fill=white, inner sep=2pt]{$#1$}} 
             }
          }% end of forestset
  
\begin{forest}
for tree = {
% node style
    circle,
    draw, 
    minimum size = 1.5em,
    inner sep=0pt,
    math content,
% tree style
    edge={very thick},
    s sep=3mm,
    l sep=12mm,
           }
[0,
    [1, edge=red, EL=s_1]
    [2, edge=blue,EL=s_2,fit=band
        [3, edge=orange]
        [4, edge=blue]
        [8, edge=orange]
    ]
    [6,edge=orange]
    [7,edge=orange]
    [11,edge=blue,fit=band
        [10,edge=red]
        [9, edge=blue]
        [5, edge=orange]
    ]
    [12, edge=red]
]
    \end{forest}
\end{document}

ingrese la descripción de la imagen aquí

Anexo (1): Si desea aumentar la distancia entre los nodos "6" y "7" únicamente, lo más simple es insertar un nodo fantasma entre ellos:

\documentclass{article}
\usepackage{forest}

\begin{document}
\forestset{
  EL/.style={% shortens for (my) edge label
             edge label={node[midway, font=\small, text=black,
                         fill=white, inner sep=2pt]{$#1$}}
             }
          }% end of forestset

\begin{forest}
for tree = {
% node style
    circle,
    draw,
    minimum size = 1.5em,
    inner sep=0pt,
    math content,
% tree style
    edge={very thick},
    s sep=3mm,
    l sep=12mm,
           }
[0,
    [1, edge=red, EL=s_1]
    [2, edge=blue,EL=s_2, fit=band
        [3, edge=orange]
        [4, edge=blue]
        [8, edge=orange]
    ]
    [6,edge=orange]
    [, phantom, no edge]  % <---
    [7,edge=orange]
    [11,edge=blue,fit=band
        [10,edge=red]
        [9, edge=blue]
        [5, edge=orange]
    ]
    [12, edge=red]
]
    \end{forest}
\end{document}

ingrese la descripción de la imagen aquí

Anexo (2): Si desea tener una imagen más estrecha del árbol, puede configurar:

  • s sep=1mms
  • eliminar fit=bandopciones en el nivel inferior del árbol
  • reducir el tamaño de fuente de las etiquetas de borde afont=\footnotesize
  • Empuje la posición de la etiqueta del borde hacia abajo reemplazando midwayconpos=0.65
  • Reduzca el tamaño de fuente de los nodos del árbol agregando una opción font=\smallen \for treela configuración.
  • reduzca el tamaño del nodo a `tamaño mínimo = 1,2 em El nuevo MWE es:
\documentclass{article}
\usepackage{forest}

\begin{document}
\forestset{
  EL/.style={% abbreviation for Edge Label
             edge label={node[pos=0.65, font=\footnotesize, text=black,
                         fill=white, inner sep=2pt]{$#1$}}
             }
          }% end of forestset

\begin{forest}
for tree = {
% node style
    circle,
    draw,
    font=\small,
    minimum size = 1.2em,
    inner sep=0pt,
    math content,
% tree style
    edge={very thick},
    s sep=2mm,
    l sep=12mm,
           }
[0,
    [1, edge=red, EL=s_1]
    [2, edge=blue,EL=s_2,
        [3, edge=orange]
        [4, edge=blue]
        [8, edge=orange]
    ]
    [6,edge=orange]
    [7,edge=orange]
    [11,edge=blue,
        [10,edge=red]
        [9, edge=blue]
        [5, edge=orange]
    ]
    [12, edge=red]
]
    \end{forest}
\end{document}

que producen:

ingrese la descripción de la imagen aquí

Respuesta2

ingrese la descripción de la imagen aquí

\documentclass{article}
\usepackage{tikz}

\usetikzlibrary{shapes.geometric}
\begin{document}
    \begin{tikzpicture}[
        every node/.style={% standard style for all nodes no repetition required every time
            thin, 
            black,
            draw,
            circle,
            inner sep=1pt,% space around the text in the circle
            text width=10pt,%uniform circles minimum size
            text centered
        },
    level/.style={
        sibling distance=15mm/#1
    },
        level distance=5em% can vary to suit 
]
        \node [] {0}
        child[very thick,red] {node [] {$1$} edge from parent node [draw=none,fill=white] {$s_1$}}
        child[very thick,blue] {node [] {$2$}
            child[very thick, red] {node [] {$3$}}
            child[very thick, blue] {node [] {$4$}}
            child[very thick, orange] {node [] {$8$}}
            edge from parent node [fill=white,draw=none] {$s_2$} }
        child[very thick,orange] {node [] {$6$}}
        child[very thick,orange] {node [] {$7$}}
        child[very thick,blue] {node [] {$11$}
            child[very thick, red] {node [] {$10$}}
            child[very thick, blue] {node [] {$9$}}
            child[very thick, orange] {node [] {$5$}}
        }
        child[very thick,red] {node [] {$12$}};
    \end{tikzpicture}
\end{document}

información relacionada