예제 #1
0
 /// <summary>
 /// Remove um valor da árvore
 /// </summary>
 /// <param name="valor">Valor a ser removido</param>
 public void Remover(Tipo valor)
 {
     Raiz = Remover(Raiz, valor);
 }
예제 #2
0
        /// <summary>
        /// Desenha uma árvore binária recursivamente
        /// </summary>
        /// <param name="origin">Origem do desenho</param>
        /// <param name="raiz">Raíz da árvore a ser desenhada</param>
        /// <param name="g">Instância de Graphics para desenho</param>
        /// <param name="nivel">Nível da árvore sendo desenhado</param>
        private void DesenharArvore(PointF origin, NoArvore <Cidade> raiz, Graphics g, int nivel = 0)
        {
            if (raiz == null)
            {
                return;
            }

            // Cálculo do ângulo de abertura da árvore em radianos
            double rad = (TREE_ANGLE_DEGREES / Math.Pow(2, nivel)) * Math.PI / 180;

            float len = TREE_EDGE_LENGTH - TREE_EDGE_VARIATION * nivel;

            // Calcula a posição para os nós esquerdo e direito
            PointF left = new PointF(
                origin.X + (float)(Math.Cos(Math.PI / 2 + rad) * len),
                origin.Y + (float)(Math.Sin(Math.PI / 2 + rad) * len)
                );

            PointF right = new PointF(
                origin.X + (float)(Math.Cos(Math.PI / 2 - rad) * len),
                origin.Y + (float)(Math.Sin(Math.PI / 2 - rad) * len)
                );

            // Desenha as linhas para os nós filhos
            using (Pen outline = new Pen(Color.White, 5))
            {
                if (raiz.Esquerda != null)
                {
                    g.DrawLine(outline, origin, left);
                    g.DrawLine(Pens.Red, origin, left);
                }

                if (raiz.Direita != null)
                {
                    g.DrawLine(outline, origin, right);
                    g.DrawLine(Pens.Red, origin, right);
                }
            }

            // Desenha o círculo para a raíz
            float      r    = TREE_NODE_RADIUS;
            RectangleF rect = new RectangleF(origin.X - r / 2, origin.Y - r / 2, r, r);

            g.FillEllipse(Brushes.Blue, rect);

            using (Pen p = new Pen(Color.White, 2))
                g.DrawEllipse(p, rect);

            // Desenha o nome da cidade
            TextRenderer.DrawText(
                g,
                raiz.Info.ToString(),
                Font,
                new Point((int)origin.X, (int)origin.Y),
                Color.Black, Color.White
                );

            // Chama o procedimento para os nós filhos
            DesenharArvore(left, raiz.Esquerda, g, nivel + 1);
            DesenharArvore(right, raiz.Direita, g, nivel + 1);
        }
예제 #3
0
 /// <summary>
 /// Construtor
 /// </summary>
 public ArvoreBinaria()
 {
     Raiz = null;
 }