Соединение всех узлов на одном уровне двоичного дерева включает связывание указателя right_neighbor
каждого узла (в дереве) с его соседним узлом на том же уровне.
Бинарное дерево (СЛЕВА) и двоичное дерево со всеми узлами, соединенными на одном уровне (ПРАВО)
Реализация
Обход уровня и порядка означает посещение всех узлов на одном уровне перед переходом на следующий уровень. В следующем коде обход порядка уровней выполняется в дереве, а для right_neighbor
устанавливается ближайший сосед на том же уровне.
- C ++ полилиния>
- C ++
- C ++
- Python3
- Python3
#include using namespace std; #include //Дерево nodestruct Tree {char data; Дерево * слева; Дерево * справа; Дерево * right_neighbor; Дерево (символьные данные) {это -> данные = данные; left = NULL; right = NULL; right_neighbor = NULL; }};//Функция для печати right_neighbor узловvoid PreOrderTraversal (Tree * node) {if (node == NULL) {return; } else {if (node -> right_neighbor! = NULL) {cout data " right_neighbor -> data данные NULL" слева); PreOrderTraversal (узел -> справа); }} int main () {//Дерево Tree * root = new Tree ('a'); корень -> left = новое дерево ('b'); корень -> право = новое дерево ('c'); корень -> влево -> влево = новое дерево ('d'); корень -> влево -> вправо = новое дерево ('e'); очередь Q; //Помещаем корневой узел в очередь Q.push (root); //Поставить в очередь NULL для обслуживания раздела между уровнями Q.push (NULL); while (! Q.empty ()) {//Удаляем элемент из очереди Tree * node = Q.front (); Q.pop (); if (node == NULL) {//Это показывает, что уровень завершился, поэтому поставьте//в очередь NULL, чтобы обозначить это. если (! Q.empty ()) {Q. push (NULL); }} else {//Посмотрите на элемент в начале очереди и//установите правый указатель на соседний элемент в узле очереди -> right_neighbor = Q.front (); //Помещаем в очередь его левого и правого потомков, если они существуют if (node -> left! = NULL) {Q.push (node -> left); } если (узел -> право! = NULL) {Q.push (узел -> право); }}} PreOrderTraversal (корень); return 0;}