árbol binario de búsqueda equilibrado usando SortedSet

votos
0

Por favor, ayuda que he estado tratando de generar un árbol binario de búsqueda aleatoria de tamaño 1024 y los elementos tiene que ser SortedSet al azar ... Soy capaz de escribir un código para crear un árbol binario de búsqueda de forma manual mediante la adición de elementos de forma manual, pero yo m unablele yo escribir código que generaría un árbol binario equilibrado aleatoria de tamaño 1024 luego usar tratar de encontrar una clave en ese árbol ... por favor por favor y gracias u por delante ....

Editar código agregado de comentarios

ya que es tarea ... y esto es lo que tengo hasta ahora como código:

using System; 
namespace bst { 
    public class Node { 
        public int value; 
        public Node Right = null; 
        public Node Left = null; 

        public Node(int value) 
        { 
            this.value = value; 
        } 
    } 

    public class BST { 
        public Node Root = null; 
        public BST() { }

        public void Add(int new_value) 
        { 
            if(Search(new_value)) 
            {
                Console.WriteLine(value ( + new_value + ) already);
            }
            else
            {
                AddNode(this.Root,new_value);
            }
        }
    }
}
Publicado el 21/01/2011 a las 00:53
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
2

Utilizar la recursividad. Cada rama genera una nueva rama, seleccionar el elemento central en el conjunto sin clasificar, la mediana. Ponerlo en el elemento actual en el árbol. Copiar todos los elementos menor que la mediana a otra matriz, enviar esa nueva matriz a la llamada del mismo método. Copiar todos los artículos mayor que la mediana a otra matriz, que envía nueva matriz a la llamada del mismo método. \

árboles equilibrados tiene que tener un número impar de elementos, a menos que el nodo principal de los padres no se rellena. Es necesario decidir si hay dos valores que son la mediana, si el duplicado pertenece en la rama inferior o rama superior. Pongo duplicados en la rama superior en mi ejemplo.

La mediana será el número donde una cantidad igual de números es menor que y mayor que el número. 1,2,3,3,4,18,29,105,123 En este caso, la mediana es 4, a pesar de que la media (o promedio) es mucho mayor.

No incluí código que determina la mediana.

BuildTreeItem(TreeItem Item, Array Set)  
{
  Array Smalls;
  Array Larges;
  Median = DetermineMedian(Set);
  Item.Value = Median;
  if(Set.Count() == 1)
    return;  
  for (int i = 0; int i < Set.Count(); i++)
  {
    if(Set[i] < Median)
    {
      Smalls.new(Set[i]);
    }
    else
    {
      Larges.new(Set[i]);
    }
  }
  Item.Lower = new TreeItem;
  Item.Upper = new TreeItem;
  BuildTreeItem(TreeItem.Lower, Smalls);
  BuildTreeItem(TreeItem.Upper, Larges);
}
Respondida el 21/01/2011 a las 01:13
fuente por usuario

votos
0

A menos que sea la tarea la solución más fácil sería para ordenar los datos primero y luego construir un árbol mediante el uso de punto medio como root y descendiendo por cada mitad. Método propuesto por Xaade es similar , pero mucho más lento debido a la complejidad DetermineMedian .

La otra opción es desviar la mirada hacia algoritmos que construyen árboles equilibrados (como http://en.wikipedia.org/wiki/Red-black_tree ) para ver si se ajusta a sus necesidades.

EDIT: la eliminación de declaración incorrecta acerca de la velocidad del algoritmo de Xaade - en realidad es una especie tan rápido como rápido (n log n - comprobar cada elemento en cada nivel de recursividad con registro n niveles de recursividad), no está seguro de qué estimé más lento.

Respondida el 21/01/2011 a las 02:42
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more