Подсчет ветвей до заданной вершины С++

243
04 декабря 2017, 17:37

Я написал функцию подсчета ветвей - branches(TNode*&, int). Работает почти исправно, но если ввести несуществующую вершину, то выдает просто значение для места где бы она должна была располагаться, а нужно вывести, например, -1. Пытался писать различные условия, ничего не выходит, помогите.

#include "stdafx.h"
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
struct TNode {
    int data;
    TNode* left;
    TNode* right;
};
void add(TNode *&tr, int d) {
    if (tr == NULL) {
        tr = new TNode;
        tr->data = d;
        tr->left = tr->right = 0;
    }
    if (d < tr->data)
        add(tr->left, d);
    if (d > tr->data)
        add(tr->right, d);
}
int branches(TNode *&tr, int n) {
    int count = 0, cht = -1;
    if (tr == NULL)
        return 0;
    if (tr->data == n)
        return count;
    return ++count + branches(((tr->data > n) ? tr->left : tr->right), n);
}
int depth_path(TNode *&tr) {
    if (!tr)
        cout << "\nДерева не существует\n";
    if (tr->left == 0 && tr->right == 0) 
        return -1;
    return 1 + depth_path(tr->left);
}
void tree_print(const TNode* tr) {
    if (tr == NULL)
        return;
    else {
        tree_print(tr->left);
        cout << tr->data << ' ';
        tree_print(tr->right);
    }
}
void input_data(TNode *&tr, int dt) {
    int n = 0;
    cout << "Введите количество элементов: \n"; cin >> n;
    while (n--) {
        cout << "Введите элемент: "; cin >> dt;
        add(tr, dt);
    }
}
void del(TNode *&tr) {
    if (tr != NULL) {
        del(tr->left);
        del(tr->right);
        delete tr;
        tr = NULL;
    }
}
int main() {
    setlocale(LC_ALL, "rus");
    TNode* tree;
    int data = 0, temp = 0, n = 0; // n - для подсчета ветвей, темп - для хранения ветвей
    tree = NULL;
    input_data(tree, data);
    cout << endl;
    tree_print(tree);
    cout << "\nКакую цифру хотите найти: "; cin >> n;
    temp = branches(tree, n);

    cout << "\nГубилна: " << depth_path(tree);
    cout << "\nКоличество ветвей: " << temp << "\n";
    del(tree);
    system("pause");
    return 0;
}
Answer 1

Как я понимаю, проверка

if (tr == NULL)
    return 0;

показывает, что нужного узла нет, и пора возвращать -1. Так? Ну так давайте и будем возвращать эту -1:

int branches(TNode *tr, int n) {
    int count = 0, cht = -1;
    if (tr == NULL)
        return -1;
    if (tr->data == n)
        return count;
    int br = branches(((tr->data > n) ? tr->left : tr->right), n);
    if (br == -1) return -1;
    return ++count + br;
}

(Не компилировал, просто показываю идею).
Еще один вариант - через генерацию исключения, но стоит ли?

READ ALSO
Вывод в файл .c++

Вывод в файл .c++

Как вывести в файл значения целочисленных переменных x,y,z (здесь z - количество часов, y - количество минут, x - количество секунд) в формате hh:mm:ss...

367
Заголовочные файлы / библиотека / STL

Заголовочные файлы / библиотека / STL

Я правильно понимаю, что: Библиотека - это набор функций ? Заголовочный файл - это набор прототипов нужных функций из библиотеки ? Стандартная...

277
оператор new возвращает указатель на 0 байт

оператор new возвращает указатель на 0 байт

Для чего может понадобиться такая конструкция и почему при запросе 0 байт возвращается указатель

222
Не срабатывает realloc с разыменованием указателя

Не срабатывает realloc с разыменованием указателя

Есть два класса - родитель (Capture) и потомок (Camera)В родителе реализована одна общая функция, которая вызывает функцию, переопределённую у потомков:

228