Intereting Posts
Использование var_arg для передачи параметров для вызовов функций Почему getch () не читает последнего введенного символа? Случайный float в C с использованием getrandom Есть ли веская причина, почему VLA не разрешены в указателях в структурах? заполнение массива в цикле va_copy – портирование на визуальный C ++? глубокая копия Linkedlist без уничтожения исходного списка и дополнительного пространства для хранения (с использованием ANSI C) Подсчитайте количество вхождений 0 в целых числах от 1 до N Почему #define INVALID_VALUE -999; дать синтаксическую ошибку при использовании? Когда использовать NULL и когда использовать ‘\ 0’ в связанном списке в C? C для индексирования циклов: ускоренная перемотка вперед в новых процессорах? Не эквивалентны и (* a) как параметры функции? c не работает scanf char Вставка двоичного поиска не работает как отлаживать приложение как root в eclipse в Ubuntu?

Вставка элемента в двоичное дерево

Пробовал много разбираться по сети, но мог получить любую помощь: везде, где он добавлял узел в дерево двоичного поиска.

Вопрос: запрос алгоритма и fragmentа кода для добавления узла в двоичное дерево . (или указать мне правильный URL)

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

(запрос: если вы пишете fragment кода, пожалуйста, используйте правильное имя переменной, что помогает в понимании)

Например: двоичное дерево

5 7 3 x 1 x 2 x 3

5 7 3 x1 x2 x3 

Дерево двоичного поиска 5 7 3 2 4 6

  5 3 7 2 4 6 insert(int key, struct node **root) { if( NULL == *root )` { *root = (struct node*) malloc( sizeof( struct node ) );` (*root)->data = key; (*root)->left = NULL; (*root)->right = NULL; } else if(key data) { insert( key, &(*root)->left ); } else if(key > (*root)->data) { insert( key, &(*root)->right ); } } 

    Разница между двоичным деревом и деревом двоичного поиска заключается в том, что хотя оба они имеют ограничения, что каждый узел может иметь не более 2 дочерних узлов, двоичное дерево поиска (BST) также должно иметь свой левый дочерний элемент равным или меньшим значением, а его правильный ребенок должен иметь большую или равную ценность. Вот почему это называется деревом «Поиск», потому что все упорядочено численно и имеет время выполнения O (logn) для поиска.

    Поскольку нет требования быть BST, двоичное дерево может быть сохранено в векторе (массиве). Когда вы вставляете в вектор, вы строите двоичное дерево в порядке уровня. Код ниже:

     // typedef the node struct to NODE // nodeVector similar to STL's vector class insert(int key, NODE** nodeVector) { NODE *newNode = (NODE*) malloc( sizeof( NODE ) ); newNode->data = key; newNode->left = NULL; newNode->right = NULL; // add newNode to end of vector int size = nodeVector->size(); nodeVector->push_back(newNode); // if newNode is not root node if(nodeVector->size() > 1) { // set parent's child values Node* parent = (size/2)-1; // take advantage of integer division instead of using floor() if (parent->left == NULL) { parent->left = newNode; } else { parent->right = newNode; } } } 

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

     struct Treenode* temp; Q = CreateQueue(); EnQueue(Q,root); while(!IsEmptyQueue(Q)) { temp = DeQueue(Q); if(temp->left) EnQueue(Q,temp->left); else { temp->left=newNode; DeleteQueue(Q); return; } if(temp->right) EnQueue(Q,temp->right); else { temp->right=newNode; DeleteQueue(Q); return; } } в struct Treenode* temp; Q = CreateQueue(); EnQueue(Q,root); while(!IsEmptyQueue(Q)) { temp = DeQueue(Q); if(temp->left) EnQueue(Q,temp->left); else { temp->left=newNode; DeleteQueue(Q); return; } if(temp->right) EnQueue(Q,temp->right); else { temp->right=newNode; DeleteQueue(Q); return; } } 

    Поскольку я не могу комментировать, я пишу это.
    Вышеупомянутый ответ для функции вставки двоичного дерева неверен.
    Предположим, что для 0, 1, 2, 3, 4, 5 передаются последовательно для вставки функции,
    его генерирующее дерево подобно

      0 / 1 \ 2 / 3 \ 4 / 5`

    из которых порядок обхода будет 1 3 5 4 2 0
    в то время как ответ должен быть

      0 / \ 1 2 / \ / 3 4 5 

    из которых обход хода составит 3 1 4 0 5 2.

    Поскольку я также сталкиваюсь с той же проблемой, я придумал следующее решение по сети: –

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

    Следующая ссылка может помочь вам: –

    http://www.geeksforgeeks.org/linked-complete-binary-tree-its-creation/

    Я отправляю это как ответ, потому что у меня нет необходимой репутации, чтобы опубликовать комментарий. За исключением бублика, все остальные неправильно поняли дерево как двоичное дерево поиска или полное двоичное дерево. Вопрос прост. Двоичное дерево и ответ Багельбоя выглядят правильно.