Рубрики

Зеркало н-арого Дерева

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

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

Ниже приведена реализация вышеуказанной идеи на C ++.

C ++

// C ++ программа для зеркалирования n-арного дерева
#include <bits/stdc++.h>

using namespace std;

  
// Представляет узел n-арного дерева

struct Node

{

    int key;

    vector<Node *>child;

};

  
// Функция для преобразования дерева в его зеркало

void mirrorTree(Node * root)

{

    // Базовый случай: ничего не делать, если root равен NULL

    if (root==NULL)

        return;

  

    // Количество детей корня

    int n = root->child.size();

  

    // Если число детей меньше 2, т.е.

    // 0 или 1 нам не нужно ничего делать

    if (n < 2)

        return;

  

    // Вызов зеркальной функции для каждого ребенка

    for (int i=0; i<n; i++)

        mirrorTree(root->child[i]);

  

    // Обратный вектор (массив переменного размера) дочернего элемента

    // указатели

    reverse(root->child.begin(), root->child.end());

}

  
// Сервисная функция для создания нового узла дерева

Node *newNode(int key)

{

    Node *temp = new Node;

    temp->key = key;

    return temp;

}

  
// Печатает n-арное дерево на уровне мудрости

void printNodeLevelWise(Node * root)

{

    if (root==NULL)

        return;

  

    // Создаем очередь и ставим в нее корень

    queue<Node *>q;

    q.push(root);

  

    // Делаем прохождение порядка уровня. Используются две петли

    // чтобы убедиться, что печатаются разные уровни

    // в разных строках

    while (!q.empty())

    {

        int n = q.size();

        while (n>0)

        {

            // Удалить элемент из очереди и распечатать его

            Node * p = q.front();

            q.pop();

            cout << p->key << " ";

  

            // ставим в очередь все дочерние элементы исключенного элемента

            for (int i=0; i<p->child.size(); i++)

                q.push(p->child[i]);

            n--;

        }

  

        cout << endl; // Разделитель между уровнями

    }

}

  
// Драйвер программы

int main()

{

    / * Давайте создадим под деревом

    * 10

    * / / / /

    * 2 34 56 100

    * | / | /

    * 1 7 8 9

    * /

    Node *root = newNode(10);

    (root->child).push_back(newNode(2));

    (root->child).push_back(newNode(34));

    (root->child).push_back(newNode(56));

    (root->child).push_back(newNode(100));

    (root->child[2]->child).push_back(newNode(1));

    (root->child[3]->child).push_back(newNode(7));

    (root->child[3]->child).push_back(newNode(8));

    (root->child[3]->child).push_back(newNode(9));

  

    cout << "Level order traversal Before Mirroring\n";

    printNodeLevelWise(root);

  

    mirrorTree(root);

  

    cout << "\nLevel order traversal After Mirroring\n";

    printNodeLevelWise(root);

  

    return 0;

}

питон

# Python-программа для зеркального отображения n-арного дерева

  
# Представляет узел n-арного дерева

class Node :

  

    # Сервисная функция для создания нового узла дерева

    def __init__(self ,key):

        self.key = key 

        self.child = []

  

  
# Функция для преобразования дерева в его зеркало

def mirrorTree(root):

      

    # Базовый случай: ничего не делать, если root отсутствует

    if root is None:

        return

      

    Количество детей корня

    n = len(root.child)

  

    # Если количество детей меньше 2, т.е.

    # 0 или 1 нам ничего не нужно делать

    if n <2 :

        return

      

    # Вызов функции зеркала для каждого ребенка

    for i in range(n):

        mirrorTree(root.child[i]);

      

    # Обратный массив дочерних указателей переменного размера

    root.child.reverse()

      

  
# Печатает n-арное дерево на уровне мудрости

  

def printNodeLevelWise(root):

    if root is None:

        return 

      

    # создать очередь и поставить в нее корень

    queue = []

    queue.append(root)

  

    # Делать прохождение порядка уровня. Используются две петли

    # чтобы убедиться, что напечатаны разные уровни

    # в разных строках

    while(len(queue) >0):

  

        n = len(queue)

        while(n > 0) :

  

            # Удалить элемент из очереди и распечатать его

            p = queue[0]

            queue.pop(0)

            print p.key,

      

            # Поставить всех детей в очередь на предмет снятия с очереди

            for index, value in enumerate(p.child):

                queue.append(value)

  

            n -= 1

        print "" # Разделитель между уровнями

          

  
# Драйверная программа

  

    "" "Давайте создадим под деревом

    * 10

    * / / / /

    * 2 34 56 100

    * | / | /

    * 1 7 8 9

    «»»

  

root = Node(10)

root.child.append(Node(2))

root.child.append(Node(34))

root.child.append(Node(56))

root.child.append(Node(100))

root.child[2].child.append(Node(1))

root.child[3].child.append(Node(7))

root.child[3].child.append(Node(8))

root.child[3].child.append(Node(9))

  

print "Level order traversal Before Mirroring"

printNodeLevelWise(root)

  
mirrorTree(root)

      

print "\nLevel Order traversal After Mirroring"

printNodeLevelWise(root)


Выход:

Level order traversal Before Mirroring
10 
2 34 56 100 
1 7 8 9 

Level order traversal After Mirroring
10 
100 56 34 2 
9 8 7 1 

Спасибо Nitin Agrawal за предоставление начальной реализации. Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Зеркало н-арого Дерева

0.00 (0%) 0 votes