Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2015, 15:55   #1
Creder
 
Регистрация: 19.12.2013
Сообщений: 7
По умолчанию Удаление узлов из бинарного дерева до даты, введенной с клавиатуры

В общем, такой вопрос.
Используя классы, создать упорядоченное бинарное дерево, которое описывает справочник файлов в файловой системе. Каждому узлу соответствует некоторый файл , в узле содержится имя файла и дата последнего обращения к нему. Узлов в дереве не менее 15. Реализовать функцию, которая удаляет из дерева все файлы(узлы), обращение к которому было произведено до даты, введённой с клавиатуры. Исходное и результирующее дерево вывести на экран.

Сам класс пытаюсь сделать, но не получается ни создать дерево, ни найти в нем нужный узел, ни удалить те узлы до даты. Как это все сделать?

Код:
#include <iostream>

using namespace std;

class Tree;

class Node
{
    char name;
    int d, m, y;
    Node* left;
    Node* right;
    Node* parent;
public:
    friend Tree;
};

class Tree
{
    Node* root;
    void walk(Node* node);
    void AddNode(char name, int d, int m, int y, Node* parent);
public:
    Tree();
    void AddNode(char name, int d, int m, int y);
    void walk();

};

Tree::Tree()
{
    root=NULL;
}
void Tree::AddNode(char name, int d, int m, int y)
{
    if(root==NULL)
    {
        cout << "Файл " << name << " добавлен в корень." << endl;
        Node* n=new Node;
        n->name=name;
        n->d=d;
        n->m=m;
        n->y=y;
        root=n;
    }

    else
    {
        cout << "Файл " << name << " добавлен." << endl;
        AddNode( name, d, m, y, root);
    }
}

void Tree::AddNode(char name, int d, int m, int y, Node* leaf)
{
        if(y<=leaf->y)
        {
            if(leaf->left!=NULL)
                AddNode(name, d, m, y, leaf->left);

            else
            {
                Node* n=new Node;
                n->name=name;
                n->d=d;
                n->m=m;
                n->y=y;
                n->parent=leaf;
                leaf->left=n;
            }
        }

        else
        {

            if(leaf->right!=NULL)
                AddNode(name, d, m, y, leaf->right);

            else
            {
                Node* n=new Node();
                n->name;
                n->d=d;
                n->m=m;
                n->y=y;
                n->parent=leaf;
                leaf->right=n;
            }
        }
}




void Tree::walk()
{
    walk(root);
}

void Tree::walk(Node* node)
{
    if(node)
    {
        cout << "Файл: " << node->name<< " Дата:" << node->d << "." << node->m << "." << node->y << endl;
        walk(node->left);
        walk(node->right);
    }
}


int main()
{
    Tree c;
    setlocale(0, "");
    char name;
    int i,n, d, m, y;
    Tree* tree = new Tree();

    cout << "Введите кол-во файлов" << endl;
    cin >> n;
    for(i=0; i<n; i++)
        {
        cout << "Имя файла: " << endl;
        cin >> name;
        cout << "День: " << endl;
        cin >> d;
        cout << "Месяц: " << endl;
        cin >> m;
        cout << "Год: " << endl;
        cin >> y;
        tree->AddNode(name, d, m, y);
        }


    c.walk();
    cout << endl;

    delete tree;
    return 0;
}
Это все на что меня хватило. Помогите, пожалуйста.

Последний раз редактировалось Creder; 01.05.2015 в 16:02.
Creder вне форума Ответить с цитированием
Старый 03.05.2015, 16:11   #2
Creder
 
Регистрация: 19.12.2013
Сообщений: 7
По умолчанию

Почему после ввода данных не выводится дерево?
Код:
include <iostream>

using namespace std;

class Tree
{
    struct Node
    {
        Node* left;
        Node* right;
        char name;
        int day;
        int month;
        int year;
    };
    Node* root;
    void print1(Node*);
 public:
     Tree()
     {
         root=0;
     }
     bool isEmptry() const { return root==0; }
     void add_node(char name, int d, int m, int y);
     void print();
     void del_node(char name, int d, int m, int y);




};

void Tree::add_node(char name, int day, int month, int year)
{
    Node* t=new Node;
    Node* parent;
    t->name=name;
    t->day=day;
    t->month=month;
    t->year=year;
    t->left=0;
	t->right=0;
	parent=0;

	if (isEmptry()) root=t;
	else
    {
        Node* curr;
        curr=root;

        while(curr)
        {
            parent=curr;
            if(t->name > curr->name) curr=curr->right;
            else curr=curr->left;
        }

        if(t->name < parent->name)
            parent->left=t;
        else
            parent->right=t;
    }
}

void Tree::print()
{
	print1(root);
}

void Tree::print1(Node* p)
{
	if(p != 0)
	{
		cout<<" "<<p->name<<" "<< p->day << "." << p->month << "." << p->year << endl;
		if(p->left) print1(p->left);
		if(p->right) print1(p->right);
	}
	else return;
}

int main()
{
    Tree c;
    setlocale(0, "");
    char name;
    int i,n, d, m, y;
    Tree* tree = new Tree();

    cout << "Введите кол-во файлов" << endl;
    cin >> n;
    for(i=0; i<n; i++)
        {
        cout << "Имя файла: " << endl;
        cin >> name;
        cout << "День: " << endl;
        cin >> d;
        cout << "Месяц: " << endl;
        cin >> m;
        cout << "Год: " << endl;
        cin >> y;
        tree->add_node(name, d, m, y);
        }


    c.print();
    cout << endl;



    c.print();
    cout << endl;

    delete tree;
    return 0;
}
Creder вне форума Ответить с цитированием
Старый 03.05.2015, 21:22   #3
Creder
 
Регистрация: 19.12.2013
Сообщений: 7
По умолчанию

Понял ошибку.
Вместо
Код:
tree->AddNode(name, d, m, y);
надо было
Код:
c.add_node(name, d, m, y);
Но я все никак не могу ничего придумать с удалением узлов до введенной даты. Как это сделать?
Creder вне форума Ответить с цитированием
Старый 04.05.2015, 14:44   #4
Creder
 
Регистрация: 19.12.2013
Сообщений: 7
По умолчанию

Возможно, можно сделать это как-то так или нужно что-то изменить?

Код:
void Tree::deleteNode(Node* p)
{
	if(p != 0)
	{
		
		if(p->left) deleteNode(p->left);
		if(p->right) deleteNode(p->right);
	}
	if(p->year <= year)
	{
		if(p->day <= day || p->month<=month)
		{
			//Здесь удаляется узел
			deleteNode(Node* p);
		}
                else deleteNode(Node* p);
	}
	else 
		deleteNode(Node* p);
}
Creder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление заданной вершины бинарного дерева. bobbyserf Общие вопросы C/C++ 0 19.04.2015 21:34
Определить правильность даты, введенной с клавиатуры (Паскаль) галина01 Помощь студентам 1 02.12.2014 20:15
удаление узлов из дерева ArniLand Общие вопросы по Java, Java SE, Kotlin 0 22.09.2010 21:36
Сортировка узлов дерева treeview gool Общие вопросы Delphi 1 06.11.2009 09:20