Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Ded_Vasilij
231 / 213 / 15
Регистрация: 01.09.2012
Сообщений: 2,103
#1

Вывод дерева по уровням (по Кнуту) - C++

10.05.2013, 23:19. Просмотров 602. Ответов 0
Метки нет (Все метки)

Добрый вечер всем
Имеется задача - написать вывод дерева по уровням. Имеется шаблон для работы с деревьями - мною же написанный.
Имеется три варианта как это сделать
1. Самый плохой - завести счетчик уровней и много раз бегать по дереву - посл каждого прохода обнуляя этот счетчик. Его я даже не рассматриваю.
2. Вариант - "узлы помнят свой уровень" - уже лучше, но по - моему все равно не очень, т.к. бегать придется очень много раз.
3. Вариант - описанный у Кнута, и, наверное, самый сложный в реализации, при этом самый эффективный - это мое мнение, если не прав прошу поправить. Там используется очередь, но если честно, то не особо разобрался с этим, поэтому прошу поподробнее объяснить алгоритм более опытных товарищей, ну или предложите свой вариант решения задачи.
на всякий случай выложу код шаблона
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#pragma once
template <typename TElem>
class Tree
{
    struct TreeElem
    {
        TreeElem* Right;
        TreeElem* Left;
        TElem inf;
        TreeElem(const TElem &x = TElem()): inf(x),Right(0),Left(0)
        {}
    };
    TreeElem* root;
public:
    Tree():root(0){}
    Tree(const TElem &x)
    {
        root = TreeElem(x);
    }
    Tree(const Tree & T)
    {
        root = Copy(T.root);
    }
    ~Tree()
    {
        MakeEmpty(root);
    }
    Tree& operator = (const Tree& T)
    {
        if(this == &T)
        {
            return *this;
        }
        MakeEmpty();
        root = Copy(T.root);
        retutn *this;
    }
    bool Find(const TElem &x) const
    {
        TreeElem *p = root;
        while (p)
        {
            if (x < p->inf)
            {
                p = p->Left;
            }
            else
                if (x > p->inf)
                {
                    p = p->Right;
                }
                else
                {
                    return p;
                }       
        }
        return 0;
    }
    void Insert(const TElem &x)
    {
        Insert(root,x);
    }
    void Delete (const TElem &x)
    {
        Delete(root,x);
    }
    void Makeempty()
    {
        MakeEmpty(root);
        root = 0;
    }
    bool IsEmpty()
    {
        return !root;
    }
    void Print()
    {
        Print(root);
    }
private:
    TreeElem* Copy(TreeElem*rt)
    {
        TreeElem *new_rt = 0;
        if(!rt)
        {
            return 0;
        }
        new_rt = new TreeElem(rt->inf);
        try
        {
            new_rt->Left = Copy(rt->Left);
            new_rt->Right = Copy(rt->Right);
            return new_rt;
        }
        catch (bad_alloc)
        {
            MakeEmpty(new_rt);
            throw;
        }
    }
    void MakeEmpty(TreeElem*& rt)
    {
        if(!rt)
        {
            return;
        }
        MakeEmpty(rt->Left);
        MakeEmpty(rt->Right);
        delete rt;
    }
    void Insert(TreeElem *& rt,const TElem &x)
    {
        if(!rt)
        {
            rt = new TreeElem(x);
            return;
        }
        if(x < rt->inf)
        {
            Insert(rt->Left,x);
        }
        else
            if (x > rt-> inf)
            {
                Insert(rt->Right,x);
            }
 
    }
    void Delete(TreeElem*& rt, const TElem &x)
    {
        if(!rt)
        {
            return;
        }
        if(x < rt->inf)
        {
            Delete(rt->Left,x);
        }
        else
            if(x > rt->inf)
            {
                Delete(rt->Right,x);
            }
            else
            {
                TreeElem*pDel = rt;
                if(!rt->Right)
                {
                    rt = rt->Left;
                }
                else
                    if(!rt->Left)
                    {
                        rt = rt->Right;
                    }
                    else
                        Del2(pDel,rt->Left);
                delete pDel;
            }
    }
    void Del2(TreeElem*&p,TreeElem*&q)
    {
        if(q->Right)
        {
            Del2(p,q->Right);
        }
        else
        {
            p->inf = q->inf;
            p = q;
            q = q->Left;
        }
    }
    void Print(const TreeElem*rt)
    {
        if(!rt)
        {
            return;
        }
        Print(rt->Left);
        
        Print(rt->Right);
        cout << rt->inf<<"\t";
    }
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2013, 23:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вывод дерева по уровням (по Кнуту) (C++):

Бинарные деревья. Напечатать все элементы дерева Т по уровням - C++
Всем привет. Помогите написать программу или хотя бы функцию, условие следующее: Напечатать все элементы дерева Т по уровням, сначала...

Класс больших чисел. Деление по Кнуту. - C++
Кнут т2 стр. 300 алгоритм D. Кто реализовал для b=2^32 или 2^16 - поделитесь, плз, если не жалко ! (А то у меня много неясных моментов....

Вывод бинарного дерева на экран в виде "дерева" - C++
основная задача: подсчет количества листьев. проблема: при просмотре хочу выводить бин. дерево, в красивом виде, возможно использование...

вывод дерева - C++
помогите вывести дерево в отсортированном виде вот код создания дерева #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;malloc.h&gt; ...

Вывод копии дерева - C++
Привет тем кто читает. Промблемка в том, что не могу вывести скопированное дерево (под вечер туплю походу). Помогите с выводом P.S. на...

Вывод дерева на экран - C++
Создаю бинарное дерево, заполняю его случайными числами. Хотелось бы все это дело аккуратно вывести на экран:) А также подсчитать сумму...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2013, 23:19
Привет! Вот еще темы с ответами:

Вывод дерева в консоли - C++
собственно надо вывести дерево на консоль построенное из сгенерированной последовательности чисел Вот что у меня вышло: // Идеальное...

Вывод бинарного дерева - C++
Помогите, пожалуйста, с программой. Нужно вывести бинарное дерево так, как выводится дерево каталогов. Пример: 11 |---5 | |---2 ...

Вывод дерева на экран - C++
#include &lt;iostream&gt; using std::cout; using std::endl; template&lt;typename T&gt; class avltree { public: struct node...

Вывод бинарного дерева в консоль - C++
Доброго времени суток! Прошу помощи в выводе бинарного дерева на экран (в консоль). Есть шаблон: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru