Исходник на Си: Организовать двоичное/бинарное дерево поиска, состоящее из целых чисел. Обход дерева в ширину используя очередь.
Добавил: | DMT |
Дата создания: | 7 мая 2008, 21:57 |
Дата обновления: | 7 мая 2008, 21:57 |
Просмотров: | 25699 последний сегодня, 22:23 |
Комментариев: | 0 |
Организовать двоичное/бинарное дерево поиска, состоящее из целых чисел. Вывести содержимое его узлов, обходя это дерево в ширину. Двоичное дерево, для всех узлов которого v значения информационной части info ( v ) этих узлов удовлетворяют соотношению: info ( левый сын v ) <= info ( v ) <= info ( правый сын v ), называется деревом поиска . Определим структуру элемента дерева: typedef struct tagTREE
Также определим операции для работы с деревом: TREE* Insert(TREE *root, char *s); // добавление элемента TREE* Remove(TREE *root, char *s); // удаление элемента TREE* Find(TREE *root, char *s); // поиск элемента void ShowTree ( TREE * root ); //вывод всего дерева на экран Добавление, поиск и удаление элементов производятся рекурсивно. В подпрограмме добавления элемента число сравнивается со значением в корне. Если оно не больше, то подпрограмма вызывается для добавления этого числа к левому поддереву, если больше, то к правому. В результате, происходит спуск к пустому поддереву, вместо которого формируется новый элемент и добавляется к дереву. Аналогично работает подпрограмма поиска. Подпрограмма симметричного обхода вызывает себя рекурсивно для левого поддерева, затем выводит значение в узле и вызывает себя для правого поддерева. В подпрограмме удаления элемента x сначала находится узел, содержащий x . Теперь, если нет левого поддерева, то этот узел уничтожается и вместо него ставится корень правого поддерева. В противном случае производится спуск вправо по левому поддереву, до тех пор, пока он возможен. В результате получаем узел, не имеющий правого поддерева. Этот узел ставится на место найденного элемента x , а его левое поддерево становится на старое место этого узла. Прохождение вершин дерева, при котором смежные вершины запоминаются в очередь, называются обходом вершин дерева в ширину . Определим структуру элемента очереди, как состоящую из информационной части и указателя на следующий элемент очереди. Для последнего элемента указатель на следующий элемент будет равен NULL . typedef struct tagQUEUE
Также определим операции для работы с очередью: void Put ( TREE * a ); //функция добавления элемента в очередь TREE * Get (); //функция удаления элемента из очередь
Для того, чтобы добавить элемент в очередь, надо сначала найти последний элемент и затем изменить его указатель, равный NULL , адресом добавляемого элемента. При удалении элемента из очереди, удаляется первый элемент очереди, а началом очереди назначается следующий за первый элемент очереди. Текст программы
Результат выполнения программы: Дерево: 5 1 34 0 8 100 -5 10 15 21 Дерево после удаления элементов 1 и -5: 5 0 34 8 100 10 15 21 |