1 Востаннє редагувалося koala (26.10.2020 21:27:52)

Тема: Допоможіть з програмою.

Дерево якось дивно відображається на консолі...

#include <iostream>
#include<conio.h>
using namespace std;
struct leaf {
    int index;
    leaf* left;
    leaf* right;
};

void tree(leaf** first) {
    if ((*first) == nullptr) {
        cout << "Корінь дерева пустий." << endl;
        int num;
        cout << "Введіть індекс кореня дерева: ";
        cin >> num;
        (*first) = new leaf;
        (*first)->left = nullptr;
        (*first)->right = nullptr;
        (*first)->index = num;
    }
    else {
        return;
    }
    leaf* last = nullptr;
    last = (*first);
    leaf* Num = new leaf;
    for (int i = 0; i < 10; i++) {
        cout << "Введіть значення листя дерева: ";
        cin >> Num->index;
        while (last->left != nullptr && last->right != nullptr) {
            if (last->index > Num->index && last->left == nullptr) {
                last = last;
                break;
            }
            else {
                last = last->left;
            }
            if (last->index < Num->index && last->right == nullptr) {
                last = last;
                break;
            }
            else {
                last = last->right;
            }
        }
        if (last->index > Num->index) {
            last->left = new leaf;
            last = last->left;
            last->index = Num->index;
            last->left = nullptr;
            last->right = nullptr;
        }
        else {
            if (last->index < Num->index) {
                last->right = new leaf;
                last = last->right;
                last->index = Num->index;
                last->left = nullptr;
                last->right = nullptr;
            }
        }

        last = (*first);

    }
}
void printtree(leaf** root, int level) {
    if ((*root)!=nullptr) {
        printtree(&(*root)->right,level+1);
        for (int i = 0; i <= level; i++) {
            cout << " ";
        }
        cout << (*root)->index << endl;
        printtree(&(*root)->left, level + 1);


    }
}



int main(void) {
    setlocale(LC_ALL, "Ukr");
    leaf* first = nullptr;
    tree(&first);
    printtree(&first, 2);




    _getch();
    return 0;
}

2

Re: Допоможіть з програмою.

Додав пану Тульському Прянику теги code.

І відображається саме так, як ви його запрограмували.

Подякували: FakiNyan, Chemist-i2

Re: Допоможіть з програмою.

Вибачте я новачок на цьому сайті... Нічого не зрозумів що Ви написали. Можете хтось допомогти з моїм кодом? Бо вже день так 3-ій сиджу над ним...

Re: Допоможіть з програмою.

Мені один раз показали що дані на консолі відображаються у вигляді дерева. І ось пробую зробити але відображається у вигляді 's'. А інколи про вводі даних ( на елементі так 5,6) консоль закривається. Якісь циганські фокуси...

5

Re: Допоможіть з програмою.

Що саме ви маєте на увазі під "у вигляді дерева"? Ви зараз друкуєте спершу праве піддерево, потім корінь, потім ліве піддерево. Те, що вони виходять літерою S - це лише тому, що дерево у вас таке.
Раджу замінити пробіли чимось змістовнішим, хоча б знаком '-'. І починати з нульового рівня. І виводити спершу корінь, як це зазвичай роблять в системних інтерфейсах (як-от дерево каталогів диску в Explorer-і). Якось так:

void printtree(leaf* root, int level=0) { //нам не потрібне посилання на посилання, ця функція нічого не змінює; усталено рівень нульовий
    if (root!=nullptr) {
        for (int i = 0; i < level; i++) {
            cout << "|";
        }
        cout << "-";
        cout << root->index << endl; //корінь
        printtree(root->left,   level + 1); //ліве піддерево
        printtree(root->right, level + 1); //праве піддерево
    }
}
...
printtree(first);
Подякували: Arete1

6

Re: Допоможіть з програмою.

Ще можна виводити в порожніх гілках, там де nullptr, позначку, що воно порожнє. Тоді ви побачите, що це не вивід неправильний, це ваше дерево літерою S росте:

void printtree(leaf* root, int level=0) {
    if (root!=nullptr) {
        printtree(root->right,level+1);
        for (int i = 0; i < level; i++) {
            cout << "|";
        }
        cout << "-";
        cout << root->index << endl;
        printtree(root->left, level + 1);
    } else {
        for (int i = 0; i < level; i++) {
            cout << "|";
        }
        cout << "-X" << endl;
    }
}

Ну і напишіть мені в ПП, як би ви хотіли перейменуватися.

Подякували: leofun011

Re: Допоможіть з програмою.

Гаразд. Даже Вам дякую за допомогу.

8

Re: Допоможіть з програмою.

Прихований текст

Даже йому? а мені? :)

Re: Допоможіть з програмою.

Дуже*

Подякували: koala1

Re: Допоможіть з програмою.

Я доречі знайшов помилку.
Там умова хибна замість цього while (last->left != nullptr && last->right != nullptr) має буди це while(last) через таку помилку сидів ламав голову і не міг видалити елемент)0

Подякували: FakiNyan, 0xDADA11C7, koala3