Связанный список - это цепочка узлов, соединенных через «next» указатели. Дерево похоже на связанный список, но каждый узел может быть связан с несколькими узлами.
Когда мы говорим о дереве, в основном мы имеем в виду двоичное дерево, то есть структуру, которая имеет два дочерних элемента, слева и справа.
Представление двоичного дерева
Узел двоичного дерева представлен структурой, содержащей часть данных и два указателя на другие структуры того же типа.
- struct node
- {
- int data;
- struct node *left;
- struct node *right;
- };
Специальный указатель, называемый ROOT указывает на узел, который является родителем всех других узлов.
Кроме того, узлы, у которых нет дочерних элементов, имеют свои левый и правый указатели, указывающие на NULL .
Базовое двоичное дерево с тремя узлами может быть создано так:
- /* Initialize nodes */
- struct node *root;
- struct node *one = NULL;
- struct node *two = NULL;
- struct node *three = NULL;
- /* Allocate memory */
- one = malloc(sizeof(struct node));
- two = malloc(sizeof(struct node));
- three = malloc(sizeof(struct node));
- /* Assign data values */
- one->data = 1;
- two->data = 2;
- three->data = 3;
- /* Connect nodes */
- one->left = two;
- one->right = three;
- two->left = NULL;
- two->right = NULL;
- three->left = NULL;
- three->right = NULL;
- /* Save address of first node in root */
- root = one;
Всего за несколько шагов мы создали двоичное дерево с тремя узлами.
Деревья могут быть намного более глубокими и сложными, чем это. Данные, хранящиеся в каждом узле, могут быть более сложными, и иметь гораздо больше дочерних элементов, нежели два.
Применение деревьев
Деревья и их варианты представляют собой чрезвычайно полезную структуру данных со множеством практических применений.
- Деревья двоичного поиска (BST) используются для быстрой проверки наличия элемента в наборе.
- Heap (Множество) - это вид дерева, который используется для сортировки множества элементов.
- Модифицированная версия дерева под названием Tries используется в современных маршрутизаторах для хранения информации о маршрутизации.
- Самые популярные базы данных используют B-Trees (B-деревья) и T-Trees (T-деревья), которые являются вариантами древовидной структуры, которую мы изучили выше для хранения своих данных.
- Компиляторы используют синтаксическое дерево для проверки (подтверждения) синтаксиса каждой написанной вами программы.
Полная программа C для реализации Tree
- #include <stdio.h>
- #include <stdlib.h>
- struct node {
- int data;
- struct node* left;
- struct node* right;
- };
- struct node* createNode(value){
- struct node* newNode = malloc(sizeof(struct node));
- newNode->data = value;
- newNode->left = NULL;
- newNode->right = NULL;
- return newNode;
- }
- struct node* insertLeft(struct node *root, int value) {
- root->left = createNode(value);
- return root->left;
- }
- struct node* insertRight(struct node *root, int value){
- root->right = createNode(value);
- return root->right;
- }
- int main(){
- struct node *root = createNode(1);
- insertLeft(root, 2);
- insertRight(root, 3);
- printf("The elements of tree are %d %d %d", root->data, root->left->data, root->right->data);
- }
Вывод программы
1 2 3