бинарное дерево поиска с помощью SortedSet

голоса
0

Пожалуйста, помогите я пытался сгенерировать случайное дерево двоичного поиска размера 1024 и элементы должны быть случайной SortedSet ... Я могу написать код, чтобы создать бинарное дерево поиска вручную путем добавления элементов вручную, но я м unablele йа написать код, который будет генерировать случайное бинарное дерево размера 1024 используйте попытаться найти ключ в этом дереве ... пожалуйста, пожалуйста и спасибо U впереди ....

Редактирование добавлен код из комментариев

я это домашнее задание ... и это то, что я получил до сих пор, как код:

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);
            }
        }
    }
}
Задан 21/01/2011 в 00:53
источник пользователем
На других языках...                            


2 ответов

голоса
2

Использование рекурсии. Каждая ветвь формирует новую ветвь, выберите средний элемент в наборе несортированного, медиана. Положите его в текущий элемент в дереве. Скопируйте все элементы меньше, чем медиана в другой массив, отправить этот новый массив на вызов одного и того же метода. Копировать все элементы больше, чем медиана в другой массив, отправить этот новый массив на вызов одного и того же метода. \

Сбалансированные дерева должны иметь нечетное количество элементов, если основной родительский узел не не заполняются. Вы должны решить, если есть два значения, которые являются медианой, принадлежит ли дубликат на нижней ветви или верхней ветви. Я положил дубликаты на верхней ветви в моем примере.

Медианный будет число, где равное количество чисел меньше и больше, чем число. 1,2,3,3,4,18,29,105,123 В этом случае медиана 4, даже если среднее значение (или среднее) гораздо выше.

Я не включаю в себя код, который определяет, медиану.

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);
}
Ответил 21/01/2011 в 01:13
источник пользователем

голоса
0

Если это не домашнее задание самым простым решением было бы первым сортировать данные , а затем построить дерево, используя средний элемент как корень и спускаясь каждую половину. Метод , предложенный Xaade похож , но гораздо медленнее из - за DetermineMedian сложности .

Другой вариант на самом деле смотреть на алгоритмы , которые строят сбалансированные деревья (как http://en.wikipedia.org/wiki/Red-black_tree ) , чтобы увидеть , если она соответствует вашим требованиям.

EDIT: удаление неверного утверждения о скорости алгоритма Xaade - это на самом деле так быстро, как быстрая сортировка (п § п - проверить каждый элемент на каждом уровне рекурсии с журналом п уровнями рекурсии), не знает, почему я оценил его медленнее.

Ответил 21/01/2011 в 02:42
источник пользователем

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