2010-11-07 7 views
1

Ну, я был на это некоторое время ... пытаясь найти алгоритм для вставки моего списка случайных чисел в двоичное дерево.Помогите вставить список значений в двоичное дерево ..?

Это то, что я получил до сих пор:

NodePtr и дерево являются указателями на узел

NodePtr CreateTree(FILE * fpData) 
{ 
    int in; 

    fscanf(fpData, "%i", &in); 
    Tree T = (NodePtr)malloc(sizeof(Node)); 
    T->Left = NULL; 
    T->Right = NULL; 
    T->value = in; 

    while((fscanf(fpData, "%i", &in)) != EOF) 
    { 
     InsertInTree(in, T); 
     printf("\n %p", T); 
    } 

    return T; 

} 


void InsertInTree(int value,Tree T) 
{ 
    if(T == NULL) 
    { 
     T->Left = (NodePtr)malloc(sizeof(Node)); 
     T->Left->Left = NULL; 
     T->Left->Right = NULL; 
     T->Left->value = value; 
     printf("\n %i ", value); 
     return; 
    } 
    if(T->Left == NULL) 
    { 
     InsertInNull(value, T->Left); 
    } 
    else if(T->Right == NULL) 
    { 
     InsertInNull(value, T->Right); 
    } 
    else 
    { 
     if(T->Left->Left == NULL || T->Left->Right == NULL) InsertInTree(value, T->Left); 
     else InsertInTree(value, T->Right); 
    } 
} 

Я потерял от того, что делать, если оба потомка конкретного узла не являются ноль. То, что я сделал здесь, работает для небольшого количества чисел (1,2,3,5,6), но если список больше, он становится неуравновешенным и неправильным.

+0

Какова цель этого двоичного дерева? Например, в двоичном дереве поиска в каждом узле вы сравниваете значение, которое вы вставляете в значение в узле. Если это меньше (или равно, ради аргумента), то значение вы проверяете левым поддеревом. Если это больше, вы проверяете право. Каждый раз, когда вы пытаетесь проверить пустое поддерево, вы создаете новый листовой узел и присваиваете ему значение, которое вы вставляете. Вы, кажется, всегда будете идти, какой бы путь в настоящее время не заселен? – Tommy

+0

Ваши варианты - либо перебалансировать себя. Или использовать многообразный алгоритм, подобный [Red-Black tree] [1], который автоматически перебалансирует. [1]: http://en.wikipedia.org/wiki/Red-black_tree – Wolph

+0

Думаю, я знаю, что мне нужно делать сейчас .... Возможно, я неправильно понял, что я думаю с этим двоичным деревом. Мне нужно заказать его. Всем спасибо. – Bri

ответ

0

Простая вставка в двоичное дерево и сохранение сбалансированного двоичного дерева - это разные проблемы. Я предлагаю вам начать с первой проблемы и просто сосредоточиться на сохранении свойств заказа в дереве. Это недалеко.

Тогда вы должны взглянуть на классические реализации для красно-черных деревьев, хорошо изученный и эффективный способ сохранения сбалансированного дерева, но с ценой это сложнее.

1

Должен ли он быть поисковым деревом? Я не вижу никаких условий if (value < T->Value).

И у вас есть InsertNull (не показан). Это не должно быть необходимым, 1 функции должно быть достаточно.

Для решения вашей основной проблемы, используйте параметр указатель на указатель или, более элегантный, всегда возвращает новое дерево:

//untested, no balancing 
Tree InsertValue(Tree t, int value) 
{ 
    if (t == null) 
     t = // create and return new node 
    else 
    { 
     if (value < t->Value) 
     t->Left = InsertValue(t->Left, value); 
     else 
     t->Right = InsertValue(t->Left, value);  
    } 
    return t; 
} 

И в CreateTree:

Tree t = InsertValue(null, in); 
+0

Что такое переменная 'old'? Наверное, ты имел в виду «т» вместо этого? –

+0

Итак, я пробовал это ... но если у меня есть что-то, что уже отсортировано ... как 1,2,3,4,5,6, он просто цепляет их вместе ..... как я его помещаю в понравившиеся двоичное дерево ...: \ – Bri

+1

@Bri: Что вы хотите, это двоичное дерево поиска * сбалансированного *, что намного сложнее, чем просто бинарное дерево поиска. См. Http://en.wikipedia.org/wiki/Balanced_binary_search_tree для ссылок на несколько различных алгоритмов для балансировки дерева двоичного поиска. –

1

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

0 
    1 2 
3 4 5 6 

Вот статья, которая объясняет далее:

http://www.cs.bu.edu/teaching/c/tree/breadth-first/

+0

любая идея о том, как код вставлять список чисел в этом формате? – Bri

+0

Обычно это делается с использованием массива в качестве хранилища и div/mult для перемещения между родителями и детьми. Я придумал схему, чтобы сделать это, используя указатели, но это оказалось слишком надуманным. Вы должны поговорить с вашим инструктором, чтобы получить более четкое определение проблемы. Я бы предположил, что это отсортированное дерево, и проблема сформулирована плохо. В классе CS, который я изучал, мы написали несбалансированное отсортированное дерево и использовали предварительный, пост и средний обход для печати содержимого дерева (а не функции поиска). Что-нибудь еще кажется странным для учителя CS для назначения. –

Смежные вопросы