Форум программистов, компьютерный форум CyberForum.ru

Добавления элемента в бинарное дерево - C++

Восстановить пароль Регистрация
 
my_life
0 / 0 / 0
Регистрация: 19.10.2013
Сообщений: 30
26.10.2013, 22:16     Добавления элемента в бинарное дерево #1
Уже создавал подобную тему , но так и не получилось разобраться до конца . Есть такая задача : нужно создать бинарное дерево , вывести его значения на экран . Потом нужно определить K - количество узлов, ключ которых больше заданного числа N. Добавить узел с ключом K.
Вот мой вариант решения:
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
 
struct tree           //структура дерева
{
    int info;         //информационное поле
    tree* left;       //левая часть
    tree* right;     //правая часть
};
void NewTree(tree* &r, int info)   //функция создания нового дерева
{
    if(NULL==r)
    {
        r=new tree;
        r->left=r->right=NULL;
        r->info=info;       //запись элемента
    }
        
        if(info<r->info)     //запись в левое поддерево
        {
            if(r->left!=NULL) NewTree(r->left,info);
            else
            {
                r->left=new tree;
                r->left->left=r->left->right=NULL;
                r->left->info=info;
            }
        }
        if(info>r->info)        //запись в правое поддерево
        {
            if(r->right!=NULL) NewTree(r->right,info);
            else
            {
                r->right=new tree;
                r->right->right=r->right->left=NULL;
                r->right->info=info;
            }
        }
}
 
 
void Show_Tree(tree* &p)      //функция вывода дерева на экран в порядке возвростания 
{
    if(!p) return;
    cout<<p->info<<" ";
    Show_Tree(p->left);
    Show_Tree(p->right);
}
 
//Функция поиска количества узлов
int K(tree* &p,int &sum,int key)
{
if(!p) return 0;
if((p->info)>key) sum++;
K(p->left,sum,key);
K(p->right,sum,key);
return sum;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"Rus");
    tree* r=NULL;
    int info;
    int sum=0;
    int key;
    for(int i=1;i<10;i++)
    {
        info=i*5;
        NewTree(r,info);
    }
    cout<<"Tree: "<<endl;
    Show_Tree(r);
    cout<<endl;
    cout<<"Enter key:";
    cin>>key;
    int kol=K(r,sum,key);
    cout<<"K="<<kol<<endl;
    NewTree(r,kol);        //добавления нового элемента с ключом К
    cout<<"Tree:"<<endl;
    Show_Tree(r);
    getch();
    return 0;
}
K нахожу правильно . А вот с добавлением нового узла немного запутался . Не пойму , правильно ли я написал?
Не могу понять , так ли я вызываю функцию , чтобы добавить у уже созданному дереву новый узел?
C++
1
 NewTree(r,kol);        //добавления нового элемента с ключом К
Помогите , пожалуйста разобраться. Заранее огромное спасибо!
Изображения
 
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
26.10.2013, 22:43     Добавления элемента в бинарное дерево #2
Ну, во первых, чтобы вывести дерево про возрастанию, нужно сначала вывести левое поддерево, потом сам элемент и потом правое поддерево, т.е. порядковой выборкой
C++
1
2
3
4
5
6
7
void Show_Tree(tree* &p)      //функция вывода дерева на экран в порядке возрастания 
{
    if(!p) return;
    Show_Tree(p->left);
    cout<<p->info<<" ";
    Show_Tree(p->right);
}
У вас же выборка предварительная
И вообще, что-то функция добавления у вас слишком объемная. Можно намного проще
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void NewTree(tree* &r, int info)   //функция создания нового дерева
{
    if (!r)
    {
        r=new tree;
        r->info=info;
        r->left=r->right=0;
    }
    else if (info < r->info)
        NewTree(r->left,info);
    else
        NewTree(r->right,info);
}
my_life
0 / 0 / 0
Регистрация: 19.10.2013
Сообщений: 30
26.10.2013, 22:58  [ТС]     Добавления элемента в бинарное дерево #3
За это спасибо . Я пока только начал изучать эту тему , так что , возможно туго соображаю .
А вот с добавлением нового узла - не пойму . Я правильно это сделал?
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
26.10.2013, 23:04     Добавления элемента в бинарное дерево #4
Да вроде работает, особо не вникал, я просто показал, как это сделать намного короче и рациональнее
my_life
0 / 0 / 0
Регистрация: 19.10.2013
Сообщений: 30
26.10.2013, 23:10  [ТС]     Добавления элемента в бинарное дерево #5
Та вроде ж работает . Только вот не пойму : почему 1 записывается после 5-ки ? почему результат не 1 5 10 15..
( в порядке возврастания )?
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
26.10.2013, 23:12     Добавления элемента в бинарное дерево #6
В том то и дело, что записывается все правильно, а неправильно выводится. Попробуйте на бумаге нарисовать это дерево и по коду "вывести", и все сразу станет понятно
my_life
0 / 0 / 0
Регистрация: 19.10.2013
Сообщений: 30
26.10.2013, 23:45  [ТС]     Добавления элемента в бинарное дерево #7
Ну если поменять на Ваш вариант , то выводит правильно . Мне нужно использовать алгоритм нисходящего обхода дерева - это он есть?

Добавлено через 14 минут
C++
1
2
3
4
5
6
void Show_Tree(tree* &p)      //функция вывода дерева на экран в порядке возвростания 
{   if(!p) return;
    Show_Tree(p->left);
    cout<<p->info<<" ";
    Show_Tree(p->right);
}
- это и есть нисходящий обход дерева?
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
26.10.2013, 23:52     Добавления элемента в бинарное дерево #8
Нет, это порядковый, у вас изначально был нисходящий, но он не по возрастанию выводит. По возрастанию - только порядковый
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2013, 00:23     Добавления элемента в бинарное дерево
Еще ссылки по теме:

Задано бинарное дерево. Определить, есть ли в этом дереве хотя бы два одинаковых элемента. Вывести C++
Принцип добавления слов в бинарное дерево C++
C++ Бинарное дерево

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

Или воспользуйтесь поиском по форуму:
my_life
0 / 0 / 0
Регистрация: 19.10.2013
Сообщений: 30
27.10.2013, 00:23  [ТС]     Добавления элемента в бинарное дерево #9
что-то я запутался уже . а почему ж тогда он выводил первое дерево в порядке возврастания ? ( 5 10 ..45)
а как тогда должен выводить дерево нисходящий алгоритм ?
я только понял , что сначала обрабатывается корень , потом левая и правая сторона

Добавлено через 26 минут
уже запутался , что и написал .
C++
1
void Show_Tree(tree* &p)
- в функцию передаётся указатель на дерево ? правильно я понял ?
Yandex
Объявления
27.10.2013, 00:23     Добавления элемента в бинарное дерево
Ответ Создать тему
Опции темы

Текущее время: 15:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru