копіювання дерева

b = GetTreeNode ( 'B', NULL, d);

c = GetTreeNode ( 'C', e, NULL);

a = GetTreeNode ( 'A', b, c);

Спочатку ми створюємо сина D, який потім приєднується до свого батька B при створенні вузла. Створюється вузол E і приєднується до свого батька C під час народження (або створення) останнього. Нарешті, створюється корінь і приєднується до своїх синів B і C.

Алгоритм копіювання дерева починає працювати з кореня і в першу чергу будує ліве піддерево вузла, а потім - праве його поддерево. Тільки після цього створюється новий вузол. Той же рекурсивний процес повторюється для кожного вузла. Відповідно вузлу t вихідного дерева створюється новий вузол з покажчиками newlptr і newrptr.

При зворотному методі проходження сини відвідуються перед їх батьками. В результаті в новому дереві створюються піддерева, що відповідають t-> Left () і t-> Right (). Сини приєднуються до своїх батьків в момент створення останніх.

// створити батька і приєднати до нього його синів

newnode = GetTreeNode (t-> data, newlptr, newrptr);

Суть відвідування вузла t в початковому дереві полягає в створенні нового вузла на дереві-дублікаті.

TreeNode * Root1, * root2; // оголосити два дерева

MakeCharTree (root1, 0); // root1 вказує на Tree_0

Пройти нащадків вузла A, починаючи з лівого піддерева (вузла B і далі до вузла D, який є правою піддерево вузла B). Створити новий вузол з даними, рівними D, і лівим і правим покажчиками, рівними NULL.

Сини вузла B пройдені. Створити новий вузол з даними, рівними B, лівим покажчиком, рівним NULL, і правим покажчиком, що вказує на копію вузла D.

Оскільки ліве піддерево вузла A пройдено, почати проходження його правого піддерева і дійти до вузла E. Створити новий вузол з даними з вузла E і полями покажчиків, рівними NULL.

Після обробки E перейти до його батьків і створити новий вузол з даними з C. У полі правого покажчика помістити NULL, а лівому покажчику привласнити посилання на копію дочірнього вузла E.

// Створити дублікат дерева t і повернути корінь нового дерева

template

// Змінна newnode вказує на новий вузол, який створюється

// за допомогою виклику GetTreeNode і приєднується

// надалі до нового дереву.

// вузла і передаються в якості параметрів в GetTreeNode

TreeNode * Newlptr, * newrptr, * newnode;

// Зупинити рекурсивне проходження при досягненні

// вузлів дерева t. в кожному вузлі цього дерева функція

// створюється його копія. В іншому випадку повертається

// і підвішує до нього копії синів.

if (t-> Left ()! = NULL)

if (t-> Right ()! = NULL)

// побудувати нове дерево від низу до верху, спочатку створюючи

// двох синів, а потім їх батьків

newnode = GetTreeNode (t-> data, newlptr, newrptr);

// повернути покажчик на новостворене дерево

Схожі статті