Бинарное дерево может быть определено рекурсивно так:
- Каждый отдельный узел (узел без поддеревьев) сам является двоичным деревом.
- Если у узла есть левое поддерево, правое или оба, это двоичное дерево.
Определение struct node
следует этому рекурсивному определению двоичного дерева.
Например:
Это изображение представляет собой двоичное дерево. Мы можем представить это двоичное дерево в C следующим образом:
Узел со значением 2 - это узел, который не имеет поддеревьев и может быть представлен в виде структуры, подобной этой:
struct node* node2 = malloc(sizeof(struct node));
node2->info = 2;
node2->llink = NULL;
node2->rlink = NULL;
Значение NULL
для llink
и rlink
означает, что у узла нет поддеревьев. Обратите внимание, что мы можем представить узлы со значениями 5 ( внизу слева один, а не вверху справа), 11 и 4.
Узел со значением 6 имеет два поддерева (помните, что все узлы сами являются поддеревьями) и, предполагая, что узлы со значениями 5 и 11 соответственно представлены
struct node* node5 = malloc(sizeof(struct node));
node5->info = 5;
node5->llink = NULL;
node5->rlink = NULL;
struct node* node11 = malloc(sizeof(struct node));
node11->info = 11;
node11->llink = NULL;
node11->rlink = NULL;
мы можем представить наш узел следующим образом:
struct node* node6 = malloc(sizeof(struct node));
node6->info = 6;
node6->llink = node5; /* Pointer to node with value 5 */
node6->rlink = node11; /* Pointer to node with value 11 */
То же самое относится ко всем остальным узлам двоичного дерева.
Обратите внимание, что мы используем указатели для поддеревьев. Причина в том, что использование NULL позволяет дереву иметь конечное число элементов, в противном случае двоичное дерево потребует бесконечного количества памяти (структура, которая содержит себя, содержит себя, содержит себя, содержит себя). требуется бесконечное количество памяти).
(Изображение взято из статьи в Википедии для Двоичное дерево и, в частности, из http://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/Binary_tree.svg/200px-Binary_tree.svg.png)