/// <summary> /// Remove um valor da árvore /// </summary> /// <param name="valor">Valor a ser removido</param> public void Remover(Tipo valor) { Raiz = Remover(Raiz, valor); }
/// <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); }
/// <summary> /// Construtor /// </summary> public ArvoreBinaria() { Raiz = null; }