TikZtree com irmãos assimétricos

TikZtree com irmãos assimétricos

Existe uma maneira de definir uma árvore (binária) em TikZ em que as inclinações das duas retas dos irmãos são diferentes.

Quero gerar uma árvore com a seguinte aparência sem posicionar cada nó separadamente.

Árvore com irmãos assimétricos:

Responder1

Eu posto esta resposta porque a resposta anterior (Sina Ahmadi) não satisfazem uma condição importante:as inclinações das duas linhas dos irmãos são diferentes.


Código personalizável:

Definimos um novo comando \binary. Sua sintaxe é a seguinte:

\binary[slope left=<num>,slope right=<num>,height=<num>] (<node>) to (<node>) node {<text>} and (<node>) node {<text>};

Isso nos dará

insira a descrição da imagem aqui

Observe que heighté from A.northe não from A.south. Melhoria necessária.

Definir para slope left=50,slope right=35,height=0.75nos dá

\documentclass[tikz,margin=3mm]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\def\binary[slope left=#1,slope right=#2,height=#3] (#4) to (#5) node #6 and (#7) node #8; {
    \node (#5) at ($(#4)+({180+#1}:{#3/cos(90-(#1))})$) {#6};
    \node (#7) at ($(#4)+({-#2}:{#3/cos(90-(#2))})$) {#8};
    \draw (#5.north)--(#4.south)--(#7.north);
}
\node (A) at (0,0) {A};
\binary[slope left=50,slope right=35,height=0.75] (A) to (1) node {1} and (B) node {B};
\binary[slope left=50,slope right=35,height=0.75] (B) to (2) node {2} and (C) node {C};
\binary[slope left=50,slope right=35,height=0.75] (C) to (3) node {3} and (D) node {D};
\binary[slope left=50,slope right=35,height=0.75] (D) to (4) node {4} and (E) node {E};
\binary[slope left=50,slope right=35,height=0.75] (E) to (5) node {5} and (F) node {F};
\end{tikzpicture}
\end{document}

insira a descrição da imagem aqui

Código menos personalizável:

Isso \binarymudou um pouco e o rótulo de todos os nós e os nomes dos nós são os mesmos agora.

\documentclass[tikz,margin=3mm]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\def\binary[slope left=#1,slope right=#2,height=#3] (#4) to (#5) and (#6); {
    \node (#5) at ($(#4)+({180+#1}:{#3/cos(90-(#1))})$) {#5};
    \node (#6) at ($(#4)+({-#2}:{#3/cos(90-(#2))})$) {#6};
    \draw (#5.north)--(#4.south)--(#6.north);
}
\node (A) at (0,0) {A};
\binary[slope left=50,slope right=35,height=0.75] (A) to (1) and (B);
\binary[slope left=50,slope right=35,height=0.75] (B) to (2) and (C);
\binary[slope left=50,slope right=35,height=0.75] (C) to (3) and (D);
\binary[slope left=50,slope right=35,height=0.75] (D) to (4) and (E);
\binary[slope left=50,slope right=35,height=0.75] (E) to (5) and (F);
\end{tikzpicture}
\end{document}

insira a descrição da imagem aqui

Responder2

Fácil de fazer com forest:

\documentclass{article}
\usepackage[linguistics]{forest}
\begin{document}
\begin{forest}for tree={calign=fixed edge angles,
calign primary angle=-30,calign secondary angle=60,l=1.25cm}
[A [1] [B [2] [C [3] [D [4] [E [5] [F]]]]]]
\end{forest}
\end{document}

saída de código

Responder3

Você pode usar foresto pacote. Aqui está um exemplo mínimo de trabalho:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{forest}

\begin{document}
\begin{forest}
[A
    [1][B
        [2][C
            [3][D
                [4][E]
                ]
            ]
        ]
    ]
]
\end{forest}
\end{document}

que produz o seguinte:

insira a descrição da imagem aqui

Você pode encontrar mais exemplosaqui.

informação relacionada